web-dev-qa-db-ger.com

Was ist "Hauptabfrage"?

Mögliches Duplizieren:
Woher wissen, welches die Hauptfrage ist?

Ich bin gespannt, was die sogenannte "Hauptabfrage" ist.

Was ich habe, sind zwei Fragen auf der Titelseite.

if (have_posts()) : while (have_posts()) : the_post();
    // do the main loop
endwhile; endif;

$posts = new WP_Query(array('post_type' => 'some_other_post_type'));
while ($posts->have_posts()) : $posts->the_post();
    // do the secondary loop
    // but still operating with the some_post_type
endwhile; wp_reset_postdata();

Ich möchte lediglich die Hauptabfrage aus Effizienzgründen in meinen benutzerdefinierten Beitragstyp ändern.

add_action( 'pre_get_posts', 'some_name');
function some_name($query) {
    if (is_front_page() && is_main_query()) {
        $query->set( 'post_type', 'some_post_type' );
        return;
    }
}

Was ich dachte, ist, dass diese Bedingung in diesem Hook nur für die erste Schleife wahr ist, aber es scheint, dass jeder new WP_Query durch sie geht.

Können Sie mir bitte erklären, was "Hauptfrage" ist und was nicht?

PS: Ich habe fast eine ähnliche Frage mit der Lösung gefunden, die Abfragen in pre_get_post hook nach benutzerdefinierten Abfragevarianten zu variieren.

8
Nathan

Ihr Filter enthält einen Fehler: Wenn Sie is_main_query aufrufen, prüfen Sie nicht, ob die übergebene Abfrage die Hauptabfrage ist, sondern, ob die derzeit aktive Abfrage die Hauptabfrage ist. Dies ist immer der Fall.

Also versuchen Sie stattdessen Folgendes:

add_action( 'pre_get_posts', 'some_name');
function some_name($query) {
    if ($query->is_front_page() && $query->is_main_query()) {
        $query->set( 'post_type', 'some_post_type' );
        return;
    }
}
8
Tom J Nowell

Die Hauptabfrage wird automatisch ausgelöst, wenn WordPress festgelegt hat, was für die Anforderungs-URI angezeigt werden soll.

Spätere Instanzen von WP_Query sind nie die Hauptabfrage, aber Sie können sie verwenden, um das Ergebnis der Hauptabfrage in $GLOBALS['wp_the_query'] zu ersetzen. Tu das nicht.

3
fuxia