Usar pre_get_posts con WP_Query
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.

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

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

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.
