Utilizarea pre_get_posts cu WP_Query
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.

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

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.

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.

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