Usar pre_get_posts con WP_Query

17 may 2012, 22:59:49
Vistas: 16.5K
Votos: 26

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

Él menciona "pre_get_posts es un filtro, para modificar cualquier consulta. Se usa más comúnmente para alterar solo la 'consulta principal'".

¿Es posible usar pre_get_posts para filtrar solo una consulta secundaria específica creada con WP_Query? Por ejemplo:

$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       // El bucle secundario
    endwhile;
endif;
wp_reset_postdata();

Agradecería cualquier ayuda.

0
Todas las respuestas a la pregunta 2
2
28

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();
       //El bucle secundario
    endwhile;
endif;
wp_reset_postdata();

EDITADO

Otra técnica que puedes usar es establecer tu propia variable de consulta y verificarla en un hook:

// indicarle a WordPress sobre nuestra nueva variable de consulta
function wpse52480_query_vars( $query_vars ){
    $query_vars[] = 'my_special_query';
    return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );

// verificar si nuestra variable de consulta está configurada en cualquier consulta
function wpse52480_pre_get_posts( $query ){
    if( isset( $query->query_vars['my_special_query'] ) )
        // hacer cosas especiales

    return $query;
}
add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' );

y en la plantilla:

// establecer la variable de consulta (junto con cualquier otra) para activar el filtro
$args = array(
    'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );
17 may 2012 23:10:19
Comentarios

Muchas gracias Milo. Esto es realmente muy útil. Siempre me pregunté si era posible establecer tu propia variable de consulta.

Ben Pearson Ben Pearson
18 may 2012 08:52:22

¿Cómo puedo usar este truco para la página de archivo? No quiero reescribir toda la consulta nuevamente para la página de archivo, pero quiero usar esta técnica.

Rohit Pande Rohit Pande
2 jul 2013 12:17:06
3

pre_get_posts se ejecuta para cada consulta de posts:

  • get_posts()
  • new WP_Query()
  • Ese widget aleatorio de posts recientes que tu cliente instaló sin que lo supieras.
  • Todo

-- @nacin

Dicho esto, a menos que excluyas tu filtro usando el condicional: is_main_query(), tu filtro se ejecutará también en tu nuevo WP_Query.

Si solo quieres apuntar a tu nuevo WP_Query específico, no hay forma de hacer eso.

17 may 2012 23:11:34
Comentarios

¿Qué hay de la técnica de Milo? Nunca la había visto antes...

brasofilo brasofilo
18 may 2012 00:56:29

Su técnica funcionará. Nunca la he usado para pre_get_posts pero sí para otros filtros como posts_where

Chris_O Chris_O
18 may 2012 01:02:57

¡Genial, algo nuevo aprendido hoy!

brasofilo brasofilo
18 may 2012 01:05:00