Ich las Stephen Harris s ausgezeichnete Antwort auf diese Frage in Bezug auf die Verwendung von WP_query()
, query_posts()
und pre_get_posts
.
Er sagt "pre_get_posts ist ein Filter zum Ändern von any query. Er wird meistens nur zum Ändern der 'main query' verwendet."
Ist es möglich, pre_get_posts
zu verwenden, um only eine bestimmte sekundäre Abfrage zu filtern, die mit WP_Query
erstellt wurde? z.B.
$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
//The secondary loop
endwhile;
endif;
wp_reset_postdata();
Jede Hilfe sehr geschätzt.
Am einfachsten ist es, die Aktion unmittelbar vor der Abfrage hinzuzufügen und sie zu entfernen unmittelbar danach.
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();
//The secondary loop
endwhile;
endif;
wp_reset_postdata();
EDIT
Eine andere Technik, die Sie verwenden können, besteht darin, Ihre eigene Abfragevariable festzulegen und dies in einem Hook zu überprüfen:
// tell WordPress about our new query var
function wpse52480_query_vars( $query_vars ){
$query_vars[] = 'my_special_query';
return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );
// check if our query var is set in any query
function wpse52480_pre_get_posts( $query ){
if( isset( $query->query_vars['my_special_query'] ) )
// do special stuff
return $query;
}
add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' );
und in der Vorlage:
// set the query var (along with whatever others) to trigger the filter
$args = array(
'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );
pre_get_posts
wird bei jeder Post-Abfrage ausgelöst:
- get_posts ()
- neue WP_Query ()
- Das zufällige Widget für die letzten Beiträge, das Ihr Client installiert hat, ohne dass Sie es wissen.
- Alles
- @nacin
Wenn Sie Ihren Filter nicht ausschließen, verwenden Sie die Bedingung: is_main_query()
. Dann wird Ihr Filter auf Ihrer neuen WP_Query ausgelöst.
Wenn Sie nur auf Ihre spezielle neue WP_Query abzielen möchten, ist dies nicht möglich.