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.

Ben Pearson
quelle

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 );
Milo
quelle
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.

Chris_O
quelle
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