Verwenden von pre_get_posts mit WP_Query


24

Ich lese 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 Abfragen. Er wird am häufigsten verwendet, um nur die 'Hauptabfrage' zu ändern."

Es ist möglich, nur eine bestimmte sekundäre Abfrage pre_get_postszu filtern, die mit ? Erstellt wurde . z.B.WP_Query

$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.

Antworten:


23

Am einfachsten ist es, die Aktion direkt vor der Abfrage hinzuzufügen und unmittelbar danach zu entfernen .

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

BEARBEITEN

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

Vielen Dank, Milo. Das ist wirklich sehr hilfreich. Ich habe mich immer gefragt, ob es möglich ist, eine eigene Abfragevariable festzulegen.
— Ben Pearson

Wie kann ich diesen Trick für die Archivseite verwenden? Ich möchte die gesamte Abfrage für die Archivseite nicht erneut schreiben, sondern diese Technik verwenden.
— Rohit Pande

4

pre_get_posts Brände für jede Post-Abfrage:

  • 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

is_main_query()Wenn Sie Ihren Filter nicht ausschließen, verwenden Sie die Bedingung: 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.


Was ist mit Milos Technik? Ich habe es noch nie gesehen ...
— Brasofilo

Seine Technik wird funktionieren. Ich habe es nie für pre_get_posts verwendet, sondern für andere Filter wie posts_where
— Chris_O

1
Cool, heute etwas Neues gelernt!
— Brasofilo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.