Muss wp_reset_query () in einem WP_Query-Aufruf verwendet werden?

26

Ich verwende den folgenden Code, um Beiträge abzurufen:

<?php
$featuredPosts = new WP_Query();
$featuredPosts->query('showposts=5&cat=3');

while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?>

    <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
    <div class="meta">
        By <?php the_author() ?>
    </div>
    <div class="storycontent">
        <?php the_excerpt(); ?>
    </div>

<?php endwhile; ?>

Muss ich verwenden wp_reset_query()? Wenn ja, wo soll ich es platzieren?

janoChen
quelle
2
Wenn Sie sich auf das Hauptabfrageobjekt an einer anderen Stelle auf der Seite verlassen, dann Ja! Sie sollten es aufrufen, um sicherzustellen, dass das Hauptabfrageobjekt die Daten enthält, bevor Sie über Ihre benutzerdefinierte Abfrage iterieren. Wenn Sie die the_post()Methode (d. $my_custom_query->the_post()H.) Aufrufen , füllen Sie die Post-Variablen, auf die sich die Hauptabfrage bezieht, neu auf. Durch das Zurücksetzen werden diese Variablen mit den vorherigen Daten aufgefüllt, wenn Sie sie aufrufen. Nach benutzerdefinierten Abfragen empfiehlt es sich, Zurücksetzungen zu verwenden.
29.

Antworten:

10

Hi @janoChen:

Einfache Antwort: nein.

Es folgt der PHP-Code für die Funktion wp_reset_query()aus /wp-includes/query.phpWordPRess v3.0.4 sowie die nachfolgend aufgerufenen Funktionen. Sie sehen, dass es in erster Linie darum geht, globale Variablen zu ändern.

Wenn Sie verwenden new WP_Query($args), weisen Sie den Rückgabewert von Werten einer lokalen Variablen zu. Wenn Sie also nicht etwas so Komplexes tun, dass Sie die Antwort auf diese Frage bereits für "Nein" kennen, müssen Sie Folgendes nicht aufrufen wp_reset_query():

function wp_reset_query() {
  unset($GLOBALS['wp_query']);
  $GLOBALS['wp_query'] =& $GLOBALS['wp_the_query'];
  wp_reset_postdata();
}

function wp_reset_postdata() {
  global $wp_query;
  if ( !empty($wp_query->post) ) {
    $GLOBALS['post'] = $wp_query->post;
    setup_postdata($wp_query->post);
  }
}

function setup_postdata($post) {
  global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;

  $id = (int) $post->ID;

  $authordata = get_userdata($post->post_author);

  $day = mysql2date('d.m.y', $post->post_date, false);
  $currentmonth = mysql2date('m', $post->post_date, false);
  $numpages = 1;
  $page = get_query_var('page');
  if ( !$page )
    $page = 1;
  if ( is_single() || is_page() || is_feed() )
    $more = 1;
  $content = $post->post_content;
  if ( strpos( $content, '<!--nextpage-->' ) ) {
    if ( $page > 1 )
      $more = 1;
    $multipage = 1;
    $content = str_replace("\n<!--nextpage-->\n", '<!--nextpage-->', $content);
    $content = str_replace("\n<!--nextpage-->", '<!--nextpage-->', $content);
    $content = str_replace("<!--nextpage-->\n", '<!--nextpage-->', $content);
    $pages = explode('<!--nextpage-->', $content);
    $numpages = count($pages);
  } else {
    $pages = array( $post->post_content );
    $multipage = 0;
  }

  do_action_ref_array('the_post', array(&$post));

  return true;
}

-Mike

MikeSchinkel
quelle
@ janoChen - heh. Er hat mich in letzter Zeit definitiv gepusht, das ist sicher! Ich denke, wie sie sagen, der Wettbewerb verbessert die Rasse (aber sicher hindert mich daran, etwas anderes produktives zu machen! '-)
MikeSchinkel
1
Nur für andere, die dies lesen, da dies immer noch die akzeptierte Antwort ist (die Antwort von @ Rarst sollte akzeptiert werden). Da das OP the_post()in seinem Code verwendet, schreiben die Best Practices vor, dass er verwenden muss wp_reset_postdata(). wp_reset_query()Anrufe wp_reset_postdata(), damit das funktioniert, obwohl die andere Sache wp_reset_query()- das Zurücksetzen der $wp_queryglobalen Variablen - nicht notwendig, aber in diesem Fall nicht schädlich ist. Die Antwort lautet also tatsächlich JA
Tom Auger
21

Es ist nicht für sich WP_Queryselbst notwendig , aber es ist notwendig (oder zumindest sinnvoll), wenn Sie verwandte Funktionen / Methoden (wie z. B. the_post()oder setup_postdata()) verwenden, um globale Variablen mit Ihren Daten zu füllen.

Grundsätzlich bedeutet das Erstellen eines neuen WP_QueryObjekts lediglich das Abrufen von Daten. Wenn Sie es jedoch zum Ausführen einer aktiven Schleife und zum Zugreifen auf Vorlagen-Tags verwenden, ändert sich die Umgebung, und es empfiehlt sich, anschließend alles zurückzusetzen.

Insgesamt - es ist keine bedeutende Leistungseinbuße, wenn Sie es aufrufen. Daher ist es einfacher, es immer aufzurufen, als zu entscheiden, ob Sie es tun oder vergessen und etwas auf mysteriöse Weise kaputt machen.

Aktualisieren

wp_reset_postdata()Funktion scheint passender Wahl zu sein. wp_reset_query()Setzt globale $wp_query(welches benutzerdefinierte WP_QueryObjekt nicht beeinflusst) und $post (welches wie oben beschrieben) Variablen zurück. wp_reset_postdata()nur restaurieren $post, das sollte reichen.

Rarst
quelle
2

Nein. Wenn Sie Ihr eigenes WP_Query-Objekt instanziieren, haben Sie damit zu tun, was Sie wollen. Wenn Sie jedoch an der global $wp_queryVariablen manipulieren , wirkt sich dies im globalen Namespace auf alle Skripte aus, die diese Variable gleichzeitig verwenden. Und wenn Sie etwas tun, um die darin enthaltenen Daten zu ändern, müssen Sie sie auch zurücksetzen, nachdem Sie sie verwendet haben.

RebelPhoenix
quelle
0

Wenn Sie eine solche benutzerdefinierte Abfrage verwenden

$cat = new WP_query(); 
$cat->query("cat=19,20,-23&showposts=5&orderby=rand"); 
while ($cat->have_posts()) : $cat->the_post(); 
  $data = get_post_meta( $post->ID, 'key', true );
$img_arrays []= $data['productimage']; 
$lnk_arrays[] =get_permalink($post_ID); 
endwhile; 
wp_reset_query(); 

Dann werden Sie nicht auf Probleme stoßen. Andernfalls, wenn es auf derselben Seite eine andere Schleife gibt, sind Sie verpflichtet, unerwartete Ergebnisse zu erzielen. Ich habe wp_reset_query () im obigen Code (der in meiner header.php-Datei platziert wurde) nicht verwendet. Als ich dann zu single.php kam, bekam ich meistens die Detailseiten anderer Kategorien, was frustrierend war. Später wurde mir klar, dass ich Ich habe vergessen, die Abfrage oben zurückzusetzen. Bald begann sie wie ein Zauber zu funktionieren.

Katie
quelle