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.

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 );

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.