Wie stellt reset_postdata den Beitrag der Hauptabfrageschleife wieder her?

7

Wie reset_postdatafunktioniert das Die Dokumente sagen:

Stellen Sie die globale Variable $ post der Hauptabfrageschleife nach einer sekundären Abfrageschleife mit new WP_Query wieder her

In der Klasse wird jedoch der "aktuelle" Beitrag der aktuellen WP_QueryInstanz als global festgelegt $post. Wie wird der Beitrag der Hauptabfrageschleife wiederhergestellt?

Die WP_QueryKlasse .

Paul
quelle
1
Es scheint, als würde sich das global $wp_querynicht ändern, aber das global $postObjekt wird überschrieben und wp_reset_postdata()verwendet das global $wp_query, um das ursprüngliche $postObjekt zurückzusetzen. Hoffentlich kann jemand mit mehr Kernkenntnissen hereinkommen und eine legitime Antwort einreichen.
Howdy_McGee
2
@Howdy_McGee das globale $wp_queryändert sich nie, außer wenn Sie query_postsoder $wp_queryals lokale Variable verwenden. Was den Rest Ihres Kommentars betrifft, sind Sie fast
genau richtig

Antworten:

7

WP_Query::reset_postdata()Setzt die globale Post-Variable ( $GLOBALS['post'] === $post) auf den aktuellen Post in der Schleife der aktuellen WP_QueryInstanz.

public function reset_postdata() {
    if ( ! empty( $this->post ) ) {
        $GLOBALS['post'] = $this->post;
        $this->setup_postdata( $this->post );
    }
}

Wenn Sie eine benutzerdefinierte Abfrage auf einer Seite ausführen, $postwird der letzte Beitrag in der Schleife dieser benutzerdefinierten Abfrage gespeichert. Das können Sie selbst testen, indem Sie hinzufügen

?><pre><?php var_dump($post); ?></pre><?php 

direkt nach der Schleife Ihrer benutzerdefinierten Abfrage.

Gleiches gilt für die Hauptabfrage nach der Schleife, $postdie den letzten Beitrag der Hauptabfrage und den ersten Beitrag in der Schleife vor der Schleife enthält.

Hier ist ein einfacher Test zum Testen des $postglobalen. Sie können dies zu Ihrer Funktionsdatei hinzufügen und jede Seite auf Ihrer Site laden

add_action( 'wp_head', function()
{
    global $post;
    ?><pre><?php var_dump($post->ID); ?></pre><?php
}):
add_action( 'wp_footer', function()
{
    global $post;

    ?><pre><?php var_dump($post->ID); ?></pre><?php 

    $q = new WP_Query( 'posts_per_page=3' );
    while ( $q->have_posts() ) {
        $q->the_post();

        ?><pre><?php var_dump($post->ID); ?></pre><?php 
        the_title();

    }   

    ?><pre><?php var_dump($post->ID); ?></pre><?php 
    wp_reset_postdata();
    ?><pre><?php var_dump($post->ID); ?></pre><?php 
});

Wie wird der Beitrag der Hauptabfrageschleife wiederhergestellt?

Dies geschieht durch einen Aufruf, wp_reset_postdata()der den globalen $postBeitrag in der Schleife der Hauptabfrage auf den aktuellen Beitrag zurücksetzt . Dies ist normalerweise der erste oder letzte Beitrag, je nachdem, ob Sie Ihre benutzerdefinierte Abfrage vor oder nach der Hauptabfrageschleife hinzufügen.

Schauen wir uns an, wie wp_reset_postdata()es geht

function wp_reset_postdata() {
    global $wp_query;

    if ( isset( $wp_query ) ) {
        $wp_query->reset_postdata();
    }
}

Wie Sie sehen können, wp_reset_postdata()ist nur ein Wrapper für WP_Query::reset_postdata(). Der wichtige Teil hierbei ist, dass es sich um einen Wrapper für die Objektmethode der Hauptabfrage handelt $wp_query->reset_postdata();.

Denken Sie daran, dass die Hauptabfrage auch verwendet WP_Query. So wird das Hauptabfrageobjekt festgelegt

/**
 * WordPress Query object
 * @global WP_Query $wp_the_query
 * @since 2.0.0
 */
$GLOBALS['wp_the_query'] = new WP_Query();

/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global WP_Query $wp_query
 * @since 1.5.0
 */
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

Also , was wp_reset_postdata()tun ist, dauert es den aktuellen Eintrag in dem Hauptabfrage - Objekt und stellt die als $postglobal, und das ist , wie WP_Query::reset_postdata()Sätze $postzum aktuellen Beitrag der Hauptabfrage

Pieter Goosen
quelle
Danke, ok, ich dachte, wp_query wurde von unserer zweiten Abfrage wiederverwendet, aber wp_query wird nicht geändert. Ich verstehe es jetzt, danke.
Paul