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.

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

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.


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.