WP_Query ile pre_get_posts kullanma


24

Ben okuyordum Stephen Harris için 'ın mükemmel cevap bu soruya kullanımına ilişkin WP_query(), query_posts()ve pre_get_posts.

Diyor "pre_get_posts değiştiren bir filtre vardır herhangi bir sorgu. Bu en sık sadece 'ana sorgu' değiştirmek için kullanılır."

Kullanmak mümkündür pre_get_postsfiltreye sadece belirli ikincil sorgu ile oluşturulan WP_Query? Örneğin.

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

Herhangi bir yardım çok takdir etmek.

Yanıtlar:


23

En basit yöntem, eylemi sorgudan hemen önce eklemek ve hemen sonra kaldırmaktır .

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

DÜZENLE

Kullanabileceğiniz diğer bir teknik de kendi sorgu değişkeninizi ayarlamak ve bir kancada olup olmadığını kontrol etmektir:

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

ve şablonda:

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

Çok teşekkürler Milo. Bu gerçekten çok yardımcı oldu. Her zaman kendi sorgunuzu değiştirmenin mümkün olup olmadığını merak etmişimdir.
— Ben Pearson

Bu numarayı arşiv sayfası için nasıl kullanabilirim? Arşiv sayfasının tamamı için sorgunun tamamını tekrar yazmak istemiyorum ancak bu tekniği kullanmak istiyorum.
— Rohit Pande

4

pre_get_posts her sorgu için ateşler:

  • get_posts ()
  • yeni WP_Query ()
  • Bu rastgele yeni mesajlar, istemciniz siz olmadan bildiğiniz yüklü widget.
  • her şey

- @nacin

Filtrenizi hariç tutmadığınız sürece şartlı kullanın: is_main_query()o zaman filtreniz yeni WP_Query'nize ateş eder.

Yalnızca kendi yeni WP_Query'nizi hedeflemek istiyorsanız, bunu yapmanın bir yolu yoktur.


Peki ya Milo'nun tekniği? Daha önce hiç görmedim ...
— brasofilo

Tekniği işe yarayacak. Ben bunu pre_get_posts için hiç kullanmadım ama posts_where gibi diğer filtreler için de kullandım
— Chris_O

1
Harika, bugün yeni bir şey öğrendim!
— brasofilo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.