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.