Saya memiliki pertanyaan berikut yang saya panggil di templat taxonomy.php saya via query_brands_geo('dealers', 'publish', '1', $taxtype, $geo, $brands);
Fungsi ini berfungsi dengan sempurna. Namun setelah membaca kodeks untuk posting kueri disebutkan pre_get_posts sebagai cara yang disukai untuk mengubah kueri default. Apakah pre_get_posts lebih efisien daripada fungsi wp_query saya di bawah?
Jika demikian, bagaimana saya membangun pre_get_posts dan meneruskan variabel dan kueri saya di bawah ini?
function my_custom_query($posttype, $poststatus, $paidvalue, $taxtype, $geo, $brands) {
global $wp_query;
$wp_query = new WP_Query();
$args = array(
'post_type' => $posttype,
'post_status' => array($poststatus),
'orderby' => 'rand',
'posts_per_page' => 30,
'meta_query' => array(
array(
'key' => 'wpcf-paid',
'value' => array($paidvalue),
'compare' => 'IN',
)
),
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => $taxtype,
'field' => 'slug',
'terms' => $geo
),
array(
'taxonomy' => 'brands',
'field' => 'slug',
'terms' => $brands
)
)
);
return $wp_query->query($args);
}
sumber
$wp_query
objek dan semuanya akan gagal total. Selain itu tidak benar bahwapre_get_posts
akan menjalankan kueri tambahan ...Jawaban yang terlambat karena jawaban yang paling banyak dipilih akan memecah kueri Anda dan tidak benar dalam beberapa poin utama.
The utama WP_Query dan filter itu
Pertama, WordPress menggunakan internal
query_posts()
(pembungkus tipis di sekitarWP_Query
yang tidak boleh digunakan dalam tema atau plugin) untuk melakukanWP_Query
. IniWP_Query
bertindak sebagai loop / query utama. Kueri ini akan berjalan melalui banyak filter dan tindakan hingga string kueri SQL yang sebenarnya dibuat. Salah satunya adalahpre_get_posts
. Lainnya adalahposts_clauses
,posts_where
, dll yang juga memungkinkan Anda untuk mencegat proses pembangunan string kueri.Pandangan mendalam tentang apa yang terjadi di dalam inti
Kesimpulan
Jika Anda benar-benar ingin memodifikasi kueri utama, maka Anda dapat menggunakan berbagai macam filter. Cukup gunakan
$query->set( 'some_key', 'some_value' );
untuk mengubah data di sana atau gunakan$query->get( 'some_key' );
untuk mengambil data untuk melakukan pemeriksaan bersyarat. Ini akan menyelamatkan Anda dari melakukan kueri kedua, karena Anda hanya mengubah kueri SQL.Jika Anda harus melakukan kueri tambahan , maka pergi dengan
WP_Query
objek. Ini akan menambahkan permintaan lain ke DB.Contoh
Karena jawaban selalu bekerja lebih baik dengan contoh, Anda di sini punya satu yang sangat bagus (alat bantu untuk Brad Touesnard), yang hanya memperluas objek inti dan karena itu cukup dapat digunakan kembali (buat plugin darinya):
Anda kemudian dapat menjalankan kueri kedua / tambahan seperti yang Anda lihat pada contoh berikut. Jangan lupa untuk mereset kueri Anda sesudahnya.
sumber
Silakan periksa jawabannya di When to WP_query (), query_posts () dan pre_get_posts .
Ini adalah sumber daya yang hebat jika Anda memiliki keraguan dalam pikiran.
sumber