Menggunakan pre_get_posts dengan WP_Query

24

Saya sedang membaca jawaban Stephen Harris yang sangat baik untuk pertanyaan ini tentang penggunaan WP_query(), query_posts()dan pre_get_posts.

Dia mengatakan "pre_get_posts adalah filter, untuk mengubah permintaan apa pun . Paling sering digunakan untuk mengubah hanya 'permintaan utama'."

Dimungkinkan untuk menggunakan hanyapre_get_posts memfilter permintaan sekunder khusus yang dibuat dengan ? misalnya.WP_Query

$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

Setiap bantuan sangat dihargai.

Ben Pearson
sumber

Jawaban:

23

Cara paling sederhana adalah menambahkan tindakan tepat sebelum permintaan dan menghapusnya segera setelah itu.

add_action('pre_get_posts', 'some_function_in_functionsphp');
$my_secondary_loop = new WP_Query(...);
remove_action('pre_get_posts', 'some_function_in_functionsphp');

if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

EDIT

Teknik lain yang dapat Anda gunakan adalah untuk mengatur var kueri Anda sendiri dan memeriksa itu di hook:

// tell WordPress about our new query var
function wpse52480_query_vars( $query_vars ){
    $query_vars[] = 'my_special_query';
    return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );

// check if our query var is set in any query
function wpse52480_pre_get_posts( $query ){
    if( isset( $query->query_vars['my_special_query'] ) )
        // do special stuff

    return $query;
}
add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' );

dan di templat:

// set the query var (along with whatever others) to trigger the filter
$args = array(
    'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );
Milo
sumber
Terima kasih banyak, Milo. Ini benar-benar sangat membantu. Saya selalu bertanya-tanya apakah mungkin untuk mengatur var permintaan Anda sendiri.
Ben Pearson
Bagaimana saya bisa menggunakan trik ini untuk halaman arsip? Saya tidak ingin menulis ulang seluruh permintaan lagi untuk halaman arsip tetapi ingin menggunakan teknik ini.
Rohit Pande
4

pre_get_posts kebakaran untuk setiap kueri pos:

  • get_posts ()
  • WP_Query baru ()
  • Widget posting terbaru acak yang dipasang klien Anda tanpa Anda sadari.
  • Segala sesuatu

- @nacin

Dengan itu dikatakan kecuali Anda mengecualikan filter Anda menggunakan persyaratan: is_main_query()maka filter Anda akan diaktifkan pada WP_Query baru Anda.

Jika Anda hanya ingin menargetkan WP_Query baru spesifik Anda, maka tidak ada cara untuk melakukannya.

Chris_O
sumber
Bagaimana dengan teknik Milo? Saya belum pernah melihatnya sebelumnya ...
brasofilo
Tekniknya akan berhasil. Ive tidak pernah menggunakannya untuk pre_get_posts tetapi ada untuk filter lain seperti posts_where
Chris_O
1
Keren, sesuatu yang baru dipelajari hari ini!
brasofilo