1. Setel kueri sebelum WP_Query dijalankan
Ini tampaknya menjadi hal yang paling penting untuk diingat ketika mencoba untuk menjaga permintaan database seminimal mungkin karena satu-satunya peluang untuk mengubah kueri, tentu saja, sebelum dijalankan dalam database SQL.
Kueri Normal
Untuk kueri normal, WordPress menggunakan wp()
fungsi, yang pada gilirannya memanggil $wp->main( $query_vars )
. "Variabel is_" dari tag kondisional ditetapkan sebelum meneruskannya WP_Query->get_posts()
, yang mengubahnya menjadi permintaan basis data MySQL dan akhirnya menyimpannya dalam objek $ wp_query. Dimungkinkan untuk memfilter kueri sebelum benar-benar dijalankan dalam database SQL .
The pre_get_posts
tindakan kait ke proses ini, memungkinkan Anda untuk mengubah query sebelum diteruskan ke WP_Query->get_posts()
.
Misalnya, jika Anda ingin memfilter kueri untuk kiriman dalam kategori "unggulan", Anda akan menggunakan add_action( 'pre_get_posts', 'your_function_name' );
dan menyertakan in_category
tag bersyarat di dalamnya your_function_name
.
function your_function_name( $query ) {
if ( $query->in_category( 'featured' ) && $query->is_main_query() ) {
// Replace 123 with the category ID of the featured category.
$query->set( 'cat', '123' );
}
}
add_action( 'pre_get_posts', 'your_function_name' );
Lihat Plugin API / Aksi Referensi / pra mendapatkan posting «WordPress Codex
Permintaan Halaman
Adapun templat halaman, seperti halaman arsip untuk kategori "unggulan", tag kondisional tidak akan berfungsi dari pre_get_posts
filter. Misalnya, Anda tidak dapat menggunakan is_category
untuk memeriksa halaman arsip karena WP_Query belum berjalan.
Sebagai gantinya, Anda harus mengubah kueri utama untuk permintaan halaman dengan new WP_Query
yang akan terlihat seperti $query = new WP_Query( 'cat=123' );
. Ini menjalankan kueri dengan set argumen yang sesuai dari awal.
Lihat Referensi Kelas / Pertanyaan WP «Codex WordPress
2. Menyimpan ke database
Anda dapat menggunakan filter untuk wp_insert_post_data
memastikan hanya $ data yang relevan dengan jenis kiriman khusus Anda yang dikembalikan wp_insert_post
. Pastikan untuk menyertakan pernyataan bersyarat untuk memeriksa jenis pos kustom Anda.
Plugin API / Referensi Filter / masukkan data posting «WordPress Codex
Pengait ini disebut oleh wp_insert_post
fungsi, yang disebut oleh wp_update_post saat Anda memperbarui jenis posting kustom Anda, biasanya dengan menyimpan konsep atau menerbitkan posting.
Anda harus membandingkannya sendiri karena saya tidak dapat berbicara secara pribadi mengenai pentingnya optimasi untuk mengurangi data yang diperbarui dalam database.
3. Apakah jenis posting kustom mempengaruhi kinerja?
Dalam pengalaman saya, jenis posting khusus adalah alat yang ampuh untuk mengelola konten. Saya tidak tahu cara lain untuk mengelola posting dengan semua cara yang memungkinkannya dengan cara yang akan menggunakan lebih sedikit sumber daya. Saya pribadi akan fokus pada menemukan cara untuk mengurangi jumlah pertanyaan yang dibuat sedapat mungkin.
Dulu ada masalah kinerja yang terkait dengan struktur permalink yang menyebabkannya terpukul ketika dimulai dengan teks, bukan angka. 3 Ini sangat menyusahkan bagi situs yang meng-hosting sejumlah besar halaman, tetapi telah dipecahkan sejak WordPress versi 3.3.
Saya hanya membawa permalink di sini karena siput biasanya merupakan bagian pertama dari struktur permalink yang mungkin atau mungkin tidak mempengaruhi kinerja sebelum versi 3.3. Selain itu, saya tidak mengetahui adanya masalah kinerja yang muncul dari penggunaan jenis posting khusus.
Opsi Kinerja Lainnya
Transien
Ini bukan pengganti untuk menjaga kueri ke minimum dalam kode Anda, tetapi Anda dapat menggunakan set_transient untuk menyimpan kueri untuk beberapa waktu sehingga kueri baru tidak diperlukan. Ini adalah contoh yang digunakan dalam posting Dave Clements . Juga, perhatikan bahwa ia merekomendasikan untuk menambahkan save_post
tindakan untuk menghapus transient setiap kali jenis posting yang diberikan diperbarui.
<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( 'its_query' ) ) ) {
$pttimestamp = time() + get_option('gmt_offset') * 60*60;
$its_query = new WP_Query( array(
'post_type' => 'spotlight',
'posts_per_page' => 1,
'post__not_in' => $do_not_duplicate,
'meta_query' => array(
array(
'key' => '_hpc_spotlight_end_time',
'value' => $pttimestamp,
'compare' => '>'
)
)
) );
set_transient( 'its_query', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
// LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>
Lebih banyak pengoptimalan kueri
Thomas Griffin memiliki beberapa kiat bagus dalam tutorialnya Mengoptimalkan WordPress Queries . Berikut daftar singkat sarannya:
Diatur 'cache_results' => false
dalam pertanyaan satu kali jika server Anda tidak menggunakan caching persisten seperti Memcached. Kueri satu kali digambarkan sebagai "kueri yang digunakan untuk menunjukkan sejumlah kecil data. Bisa jadi Anda hanya ingin menampilkan judul posting terkait dengan posting saat ini, atau Anda mungkin ingin menampilkan dropdown posting untuk memilih pengaturan opsi tertentu. "
Teladannya: $query = get_posts( array( 'posts_per_page' => 1,
'cache_results' => false ) );
Tetapkan di 'no_found_rows' => true
mana pagination tidak diperlukan. Ini akan "memotong MySQL menghitung hasilnya untuk melihat apakah kita perlu pagination atau tidak."
Teladannya: $query = new WP_Query( array( 'posts_per_page' => 1,
'no_found_rows' => true ) );
Permintaan untuk ID posting hanya jika ini adalah semua yang Anda butuhkan 'fields' => 'ids'
di get_posts
. Ini harus secara signifikan mengurangi jumlah data yang dikembalikan, yang cukup banyak per posting jika Anda melihat
Deskripsi Basis Data «WordPress Codex
Teladannya: $query = get_posts( array( 'posts_per_page' => 1,
'fields' => 'ids' ) );
Selain tip terakhir itu, alasan yang sama dapat diterapkan ketika Anda hanya membutuhkan satu atau beberapa kolom posting dengan menggunakan get_post_field .
Memiliki pemahaman yang kuat tentang cara kerja kueri sangat penting. Semakin spesifik Anda dengan pertanyaan Anda, semakin sedikit pekerjaan yang akan Anda tuntut dari database SQL Anda. Ini berarti ada sejumlah besar kemungkinan untuk mengelola permintaan basis data. Berhati-hatilah dengan kueri khusus sejauh menjalankannya (apakah ini halaman admin?), Gunakan sanitasi yang tepat dalam kueri langsung dan coba gunakan fungsi WordPress asli yang memungkinkan Anda mencapai kinerja yang sama.