Frage

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 ich das tue, wo soll ich es platzieren?

War es hilfreich?

Lösung

Hi @janchen:

Einfache Antwort: nein.

Was folgt, ist der PHP -Code für die Funktion wp_reset_query() aus /wp-includes/query.php in WordPress v3.0.4 sowie die anschließend genannten Funktionen. Sie können sehen, dass es in erster Linie darum geht, globale Variablen zu ändern.

Wenn Sie verwenden new WP_Query($args) Sie werden den Rückgabewert von Werten zu einer lokalen Variablen zuweisen, sofern Sie nichts so Komplexes tun, dass Sie die Antwort auf diese Frage bereits kennen, dann müssen Sie nicht anrufen 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

Andere Tipps

Es ist nicht notwendig für WP_Query von selbst, aber Es ist notwendig (oder zumindest gut zu tun), wenn Sie verwandte Funktionen/Methoden verwenden (wie z. the_post() oder setup_postdata() ) um globale Variablen mit Ihren Daten zu füllen.

Grundsätzlich neu erstellen WP_Query Das Objekt ist lediglich das Abrufen von Daten, aber die Verwendung von aktiven Schleifen und das Erreichen von Daten für Template -Tags ändert die Umgebung. Es ist gut, alles danach zurückzusetzen.

Insgesamt - es ist keine sinnvolle Leistungsstrafe, es zu nennen, daher ist es einfacher, es immer zu nennen, als zu entscheiden, ob Sie es sollten oder es zu vergessen und etwas auf mysteriöse Weise kaputt zu haben.

Aktualisieren

wp_reset_postdata() Die Funktion scheint eine angemessenere Wahl zu sein. wp_reset_query() weltweit zurücksetzt $wp_query (Welcher Brauch WP_Query Objekt hat keinen Einfluss) und $post (was wie oben) Variablen. wp_reset_postdata() Nur wiederhergestellt $post, was genug sein sollte.

Nein. Wenn Sie Ihr eigenes WP_Query -Objekt instanziieren, ist es Ihnen, was Sie wollen. Wenn Sie jedoch die manipulieren global $wp_query Variable, dann Sie im globalen Namespace, der das Skript eines jeden betrifft, der gleichzeitig diese Variable verwendet. Und wenn Sie etwas tun, um die darin enthaltenen Daten zu ändern, müssen Sie sie auch zurücksetzen, nachdem Sie es mit dem mit ihnen fertiggestellt haben.

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 müssen Sie auf derselben Seite eine andere Schleife gibt, um unerwartete Ergebnisse zu erzielen. Ich habe wp_reset_query () in dem obigen Code nicht verwendet (der in meiner Header.php -Datei platziert wurde. Als ich dann in Single einstieg.php Ich habe vergessen, die Abfrage oben zurückzusetzen. Bald arbeitete es wie ein Zauber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top