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 sekitar WP_Query
yang tidak boleh digunakan dalam tema atau plugin) untuk melakukan WP_Query
. Ini WP_Query
bertindak sebagai loop / query utama. Kueri ini akan berjalan melalui banyak filter dan tindakan hingga string kueri SQL yang sebenarnya dibuat. Salah satunya adalah pre_get_posts
. Lainnya adalah posts_clauses
, posts_where
, dll yang juga memungkinkan Anda untuk mencegat proses pembangunan string kueri.
Pandangan mendalam tentang apa yang terjadi di dalam inti
WordPress menjalankan wp()
fungsi (dalam wp-includes/functions.php
), yang memanggil $wp->main()
( $wp
adalah objek WP kelas, yang didefinisikan dalam wp-includes/class-wp.php
). Ini memberitahu WordPress untuk:
- Parsing URL ke dalam spesifikasi permintaan menggunakan
WP->parse_request()
- lebih lanjut tentang itu di bawah ini.
- Setel semua variabel is_ yang digunakan oleh Conditional Tag menggunakan
$wp_query->parse_query()
( $wp_query
adalah objek class WP_Query
, yang didefinisikan dalam wp-includes/query.php
). Perhatikan bahwa terlepas dari nama fungsi ini, dalam hal WP_Query->parse_query
ini tidak benar-benar melakukan parsing untuk kita, karena itu dilakukan sebelumnya WP->parse_request()
.
- Ubah spesifikasi kueri menjadi kueri basis data MySQL, dan jalankan kueri basis data untuk mendapatkan daftar kiriman, dalam fungsi WP_Query-> get_posts (). Simpan tulisan di objek $ wp_query untuk digunakan di WordPress Loop.
Source Codex
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):
class My_Book_Query extends WP_Query
{
function __construct( $args = array() )
{
// Forced/default args
$args = array_merge( $args, array(
'posts_per_page' => -1
) );
add_filter( 'posts_fields', array( $this, 'posts_fields' ) );
parent::__construct( $args );
}
public function posts_fields( $sql )
{
return "{$sql}, {$GLOBALS['wpdb']->terms}.name AS 'book_category'";
}
}
Anda kemudian dapat menjalankan kueri kedua / tambahan seperti yang Anda lihat pada contoh berikut. Jangan lupa untuk mereset kueri Anda sesudahnya.
$book_query = new My_Book_Query();
if ( $book_query->have_posts() )
{
while ( $book_query->have_posts() )
{
$book_query->the_post();
# ...do stuff...
} // endwhile;
wp_reset_postdata();
} // endif;