Utilizzare pre_get_posts con WP_Query
Stavo leggendo l'eccellente risposta di Stephen Harris a questa domanda riguardante l'uso di WP_query()
, query_posts()
e pre_get_posts
.
Egli afferma "pre_get_posts è un filtro, per modificare qualsiasi query. È più comunemente usato per alterare solo la 'query principale'".
È possibile usare pre_get_posts
per filtrare solo una specifica query secondaria creata con WP_Query
? Esempio:
$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
// Il loop secondario
endwhile;
endif;
wp_reset_postdata();
Ogni aiuto è molto apprezzato.

Il modo più semplice è aggiungere l'azione appena prima della query e rimuoverla subito dopo.
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();
// Il loop secondario
endwhile;
endif;
wp_reset_postdata();
MODIFICA
Un'altra tecnica che puoi usare è impostare il tuo query var personale e verificarlo in un hook:
// informa WordPress della nostra nuova query var
function wpse52480_query_vars( $query_vars ){
$query_vars[] = 'my_special_query';
return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );
// verifica se la nostra query var è impostata in qualsiasi query
function wpse52480_pre_get_posts( $query ){
if( isset( $query->query_vars['my_special_query'] ) )
// esegui operazioni speciali
return $query;
}
add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' );
e nel template:
// imposta la query var (insieme a qualsiasi altra) per attivare il filtro
$args = array(
'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );

Grazie mille Milo. Questo è davvero molto utile. Mi sono sempre chiesto se fosse possibile impostare una propria variabile di query.

pre_get_posts
si attiva per ogni query di post:
- get_posts()
- new WP_Query()
- Quel widget casuale di post recenti che il tuo cliente ha installato senza che tu lo sapessi.
- Tutto
-- @nacin
Detto questo, a meno che tu non escluda il tuo filtro, utilizza il condizionale: is_main_query()
altrimenti il tuo filtro si attiverà anche sulla tua nuova WP_Query.
Se vuoi solo indirizzare la tua specifica nuova WP_Query, non c'è modo di farlo.

La sua tecnica funzionerà. Non l'ho mai usata per pre_get_posts ma l'ho usata per altri filtri come posts_where
