Utilizarea pre_get_posts cu WP_Query

17 mai 2012, 22:59:49
Vizualizări: 16.5K
Voturi: 26

Am citit răspunsul excelent al lui Stephen Harris la această întrebare despre utilizarea WP_query(), query_posts() și pre_get_posts.

El spune "pre_get_posts este un filtru pentru modificarea oricărei interogări. Cel mai des este folosit pentru a modifica doar 'interogarea principală'."

Este posibil să folosești pre_get_posts pentru a filtra doar o anumită interogare secundară creată cu WP_Query? De exemplu:

$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //Bucla secundară
    endwhile;
endif;
wp_reset_postdata();

Orice ajutor este apreciat.

0
Toate răspunsurile la întrebare 2
2
28

Cea mai simplă metodă este să adaugi acțiunea chiar înainte de interogare și să o elimini imediat după.

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();
       //Bucla secundară
    endwhile;
endif;
wp_reset_postdata();

EDITARE

O altă tehnică pe care o poți utiliza este să setezi propria variabilă de interogare și să verifici aceasta într-un hook:

// anunță WordPress despre noua noastră variabilă de interogare
function wpse52480_query_vars( $query_vars ){
    $query_vars[] = 'my_special_query';
    return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );

// verifică dacă variabila noastră de interogare este setată în orice interogare
function wpse52480_pre_get_posts( $query ){
    if( isset( $query->query_vars['my_special_query'] ) )
        // efectuează acțiuni speciale

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

și în șablon:

// setează variabila de interogare (împreună cu orice altele) pentru a declanșa filtrul
$args = array(
    'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );
17 mai 2012 23:10:19
Comentarii

Mulțumesc mult, Milo. Aceasta este cu adevărat foarte util. M-am întrebat mereu dacă este posibil să-ți setezi propria variabilă de interogare.

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

Cum pot folosi acest truc pentru pagina de arhivă? Nu vreau să rescriu întreaga interogare din nou pentru pagina de arhivă, dar doresc să folosesc această tehnică.

Rohit Pande Rohit Pande
2 iul. 2013 12:17:06
3

pre_get_posts se declanșează pentru fiecare interogare de postări:

  • get_posts()
  • new WP_Query()
  • Acel widget aleatoriu cu postări recente pe care clientul tău l-a instalat fără să știi.
  • Tot

-- @nacin

Având în vedere acest lucru, dacă nu excludeți filtrul vostru, folosiți condiția: is_main_query(), atunci filtrul vostru se va declanșa și pe new WP_Query.

Dacă doriți să vizați doar interogarea specifică new WP_Query, atunci nu există nicio modalitate de a face acest lucru.

17 mai 2012 23:11:34
Comentarii

Și tehnica lui Milo? Nu am mai văzut-o până acum...

brasofilo brasofilo
18 mai 2012 00:56:29

Tehnica lui va funcționa. Nu am folosit-o niciodată pentru pre_get_posts dar am folosit-o pentru alte filtre precum posts_where

Chris_O Chris_O
18 mai 2012 01:02:57

Super, am învățat ceva nou astăzi!

brasofilo brasofilo
18 mai 2012 01:05:00