Usando pre_get_posts com WP_Query

24

Eu estava lendo a excelente resposta de Stephen Harris para essa pergunta sobre o uso de WP_query(), query_posts()e pre_get_posts.

Ele diz que "pre_get_posts é um filtro, para alterar qualquer consulta. É mais frequentemente usado para alterar apenas a 'consulta principal'".

É possível usar pre_get_postspara filtrar apenas uma consulta secundária específica criada com WP_Query? por exemplo.

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

Qualquer ajuda muito apreciada.

Ben Pearson
fonte

Respostas:

23

A maneira mais simples é adicionar a ação logo antes da consulta e removê-la imediatamente depois.

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

EDITAR

Outra técnica que você pode usar é definir sua própria consulta var e verificar isso em um gancho:

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

e no modelo:

// 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
fonte
Muito obrigado Milo. Isso é realmente muito útil. Eu sempre me perguntei se era possível definir sua própria consulta var.
Ben Pearson
Como posso usar esse truque para a página de arquivo? Não quero reescrever a consulta inteira novamente para a página de arquivamento, mas quero usar essa técnica.
Rohit Pande
4

pre_get_posts é acionado para cada consulta de postagem:

  • get_posts ()
  • novo WP_Query ()
  • Postagens recentes aleatórias fazem o widget do seu cliente instalado sem você saber.
  • Tudo

- @nacin

Com isso dito, a menos que você exclua seu filtro, use o condicional: is_main_query()seu filtro será acionado em seu novo WP_Query.

Se você deseja apenas segmentar sua nova WP_Query específica, não há como fazer isso.

Chris_O
fonte
E a técnica de Milo? Eu nunca tinha visto isso antes ...
brasofilo 17/05
Sua técnica vai funcionar. Eu nunca usei-o para pre_get_posts mas têm para outros filtros como posts_where
Chris_O
11
Legal, algo novo aprendido hoje!
Brasofilo 17/05