wake-up-neo.com

Wann sollten Sie wp_reset_postdata vs wp_reset_query verwenden?

Scheint, als ob die Hälfte der Tutorials im Codex wp_reset_postdata() und die Hälfte wp_reset_query() verwenden. Was ist das Problem? Vielleicht beide verwenden? Was ist mit rewind_posts()? Ich bitte um eine Antwort basierend auf Fakten , nicht auf Meinungen.

1
Narek Zakarian

wp_reset_postdata() setzt den Wert der Variablen global $post auf die Eigenschaft post der Hauptabfrage zurück. Dies ist der Post, an dem die Hauptabfrage zuletzt ausgeführt wurde. Sie würden dies tun, wenn Sie in einer benutzerdefinierten Abfrage setup_postdata() oder $query->the_post() verwendet hätten. Beide ersetzen die globale Variable $post, sodass Funktionen wie the_title() den richtigen Titel für den aktuellen Beitrag in einer Schleife erhalten.

wp_reset_query() setzt die Hauptabfrage auf den ursprünglichen Wert zurück. Der einzige Grund, warum mir dies bekannt ist, ist, dass Sie query_posts() zum Ändern verwendet haben. Sie sollten dies auf keinen Fall tun. Diese Funktion ruft auch intern wp_reset_postdata() auf und hat daher den gleichen Effekt.

rewind_posts() setzt den aktuellen Beitrag in der Hauptabfrage auf den ersten Beitrag. Da have_posts()rewind_posts() intern aufruft, sobald Sie an dem letzten Beitrag vorbeigekommen sind, bin ich mir nicht sicher, wann Sie dies jemals brauchen würden. Wahrscheinlich nur, wenn Sie jemals zum Anfang der Schleife zurückkehren mussten, bevor sie beendet wurde.

Grundsätzlich sollten Sie also wp_reset_postdata() verwenden, wenn Sie eine der folgenden Aktionen ausführen:

Eine sekundäre Abfrage:

$my_query = new WP_Query( $args );

while ( $my_query->have_posts() ) : $my_query->the_post();
    the_title();
endwhile;

wp_reset_postdata();

Durchlaufen von get_posts() Ergebnissen:

global $post;

$my_posts = get_posts( $args );

foreach ( $my_posts as $post ) : setup_postdata( $post );
    the_title();
endforeach;

wp_reset_postdata();

Oder einen einzelnen Beitrag erhalten und Vorlagen-Tags verwenden:

global $post;

$post = get_post( $id );

setup_postdata( $post );

the_title();

wp_reset_postdata();

Und Sie würden rewind_posts() verwenden, wenn Sie jemals an den Anfang der Schleife müssen. Dieses Beispiel ist komisch, aber ich könnte mir kein besseres vorstellen. Wenn Sie die ersten drei Beiträge der Schleife anzeigen möchten, gehen Sie zum Anfang und zeigen Sie alle an:

global $wp_query;

$started_over = false;

while ( have_posts() ) : the_post();
    the_title();

    if ( ! $started_over && $wp_query->current_post == 2 ) {
        $started_over = true;
        rewind_posts();
    }
endwhile;

Und Sie sollten im Grunde nie wp_reset_query(); brauchen

4
Jacob Peattie