Usando pre_get_posts con WP_Query

24

Estaba leyendo la excelente respuesta de Stephen Harris a esta pregunta sobre el uso de WP_query(), query_posts()y pre_get_posts.

Él dice que "pre_get_posts es un filtro, para alterar cualquier consulta. Con mayor frecuencia se usa para alterar solo la 'consulta principal'".

Es posible usar pre_get_postspara filtrar solo una consulta secundaria específica creada con WP_Query? p.ej.

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

Cualquier ayuda muy apreciada.

Ben Pearson
fuente

Respuestas:

23

La forma más sencilla es agregar la acción justo antes de la consulta y eliminarla inmediatamente después.

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

Otra técnica que puede usar es establecer su propia consulta var y verificar eso en un 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' );

y en la plantilla:

// 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
fuente
Muchas gracias Milo. Esto es realmente muy útil. Siempre me pregunté si era posible establecer su propia consulta var.
Ben Pearson
¿Cómo puedo usar este truco para la página de archivo? No quiero volver a escribir toda la consulta de nuevo para la página de archivo, pero quiero usar esta técnica.
Rohit Pande
4

pre_get_posts dispara por cada consulta posterior:

  • get_posts ()
  • nuevo WP_Query ()
  • Ese widget de publicaciones recientes al azar que su cliente instaló sin que usted lo supiera.
  • Todo

- @nacin

Dicho esto, a menos que excluya su filtro, use el condicional: is_main_query()entonces su filtro se activará en su nuevo WP_Query.

Si solo desea orientar su nueva WP_Query específica, entonces no hay forma de hacerlo.

Chris_O
fuente
¿Qué hay de la técnica de Milo? Nunca lo había visto antes ...
brasofilo
Su técnica funcionará. Nunca lo he usado para pre_get_posts pero sí para otros filtros como posts_where
Chris_O
1
¡Genial, algo nuevo aprendido hoy!
brasofilo