Ist es notwendig, wp_reset_query () in einem WP_Query-Aufruf zu verwenden?

Ich verwende den folgenden Code zum Abrufen von Posts:

query('showposts=5&cat=3'); while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?> 

<a href="https://wordpress.stackexchange.com/questions/8031/is-it-necessary-to-use-wp-reset-query-in-a-wp-query-call/">

By

Muss ich wp_reset_query() ? Wenn ich es tue, wo soll ich es hinstellen?

Solutions Collecting From Web of "Ist es notwendig, wp_reset_query () in einem WP_Query-Aufruf zu verwenden?"

Hallo @ JanoChen:

Einfache Antwort: Nein.

Was folgt, ist der PHP-Code für die function wp_reset_query() aus /wp-includes/query.php in WordPRess v3.0.4 sowie die nachfolgend aufgerufenen functionen. Sie können sehen, dass es hauptsächlich darum geht, globale Variablen zu modifizieren.

Wenn Sie new WP_Query($args) Sie den Rückgabewert von Werten einer lokalen Variablen new WP_Query($args) Wenn Sie also etwas so Komplexes tun, dass Sie die Antwort auf diese Frage bereits kennen, dann nein muss wp_reset_query() aufrufen:

 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('dmy', $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, '' ) ) { if ( $page > 1 ) $more = 1; $multipage = 1; $content = str_replace("\n\n", '', $content); $content = str_replace("\n", '', $content); $content = str_replace("\n", '', $content); $pages = explode('', $content); $numpages = count($pages); } else { $pages = array( $post->post_content ); $multipage = 0; } do_action_ref_array('the_post', array(&$post)); return true; } 

-Mike

Es ist nicht für WP_Query von selbst erforderlich, aber es ist notwendig (oder zumindest eine gute Sache), wenn Sie verwandte functionen / Methoden (wie the_post() oder setup_postdata() ) verwenden, um globale Variablen mit Ihren Daten zu füllen.

Im Grunde genommen ist das Erstellen eines neuen WP_Query Objekts lediglich ein Datenabruf, aber die Verwendung einer aktiven Schleife und das Zugänglichmachen von Daten für Vorlagen-Tags verändert die Umgebung und es ist gut, alles danach zurückzusetzen.

Insgesamt – es ist keine sinnvolle performanceseinbuße, es zu nennen, also ist es einfacher, es immer zu nennen, als zu entscheiden, ob man es vergessen sollte und etwas auf mysteriöse Weise kaputt gemacht hat.

Aktualisieren

wp_reset_postdata() function wp_reset_postdata() scheint passender zu sein. wp_reset_query() setzt global $wp_query (welches das benutzerdefinierte WP_Query Objekt nicht beeinflusst) und $post (was wie oben sein könnte) zurück. wp_reset_postdata() stellt nur $post , was ausreichen sollte.

Nein. Wenn Sie Ihr eigenes WP_Query-Objekt instanziieren, gehört es zu Ihren Aufgaben. Wenn Sie jedoch die global $wp_query Variable global $wp_query , dann global $wp_query Ihre im globalen Namespace auf das Skript eines global $wp_query Variable gleichzeitig verwendet. Und wenn Sie etwas tun, um die Daten darin zu ändern, müssen Sie es auch zurücksetzen, nachdem Sie damit fertig sind.

Wenn Sie eine benutzerdefinierte Abfrage wie diese 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 keine Probleme bekommen. Andernfalls, wenn auf der gleichen Seite eine andere Schleife ist, sind Sie verpflichtet, einige unerwartete Ergebnisse zu erhalten. Ich habe wp_reset_query () nicht in dem obigen Code verwendet (der in meiner header.php-Datei gespeichert war. Als ich dann in single.php kam, bekam ich meistens die Detailseiten anderer Kategorien, was frustrierend war. Später erkannte ich, dass ich vergessen, die Abfrage an der Spitze zurückzusetzen. Bald begann es wie ein Charme zu arbeiten.