Utilizzare pre_get_posts con WP_Query

17 mag 2012, 22:59:49
Visualizzazioni: 16.5K
Voti: 26

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.

0
Tutte le risposte alla domanda 2
2
28

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 );
17 mag 2012 23:10:19
Commenti

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

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

Come posso usare questo trucco per la pagina di archivio? Non voglio riscrivere l'intera query nuovamente per la pagina di archivio ma vorrei usare questa tecnica.

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

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.

17 mag 2012 23:11:34
Commenti

Che ne dici della tecnica di Milo? Non l'ho mai vista prima...

brasofilo brasofilo
18 mag 2012 00:56:29

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

Chris_O Chris_O
18 mag 2012 01:02:57

Fantastico, oggi ho imparato qualcosa di nuovo!

brasofilo brasofilo
18 mag 2012 01:05:00