query_posts () in function macht globale $ wp_query nicht synchron?

Das hat mich schon eine Weile ratlos gemacht. Entweder fehlt mir etwas sehr Offensichtliches oder etwas, das nicht offensichtlich ist. Ich bin mir auch nicht ganz sicher, ob das etwas mit WP oder rein PHP-Mechanik bei der Arbeit zu tun hat.

function test() { global $wp_query; var_dump($wp_query == $GLOBALS['wp_query']); } function test2() { global $wp_query; query_posts(array('posts_per_page' => 1)); var_dump($wp_query == $GLOBALS['wp_query']); } test(); test2(); 

Ergebnis:

Boolescher Wert

Boolean falsch

Warum wertet test() das auf true , aber test2() wertet das auf false ?

Solutions Collecting From Web of "query_posts () in function macht globale $ wp_query nicht synchron?"

Aktualisieren Sie mit einem besseren Beispiel

 header( 'Content-Type: text/plain;charset=utf-8' ); error_reporting( E_ALL | E_STRICT ); function failed_unset() { // Copy the variable to the local namespace. global $foo; // Change the value. $foo = 2; // Remove the variable. unset ( $foo ); } function successful_unset() { // Remove the global variable unset ( $GLOBALS['foo'] ); } $foo = 1; print "Original: $foo\n"; failed_unset(); print "After failed_unset(): $foo\n"; successful_unset(); print "After successful_unset(): $foo\n"; 

Ergebnis

 Original: 1 After failed_unset(): 2 Notice: Undefined variable: foo in /srv/www/htdocs/global-unset.php on line 21 Call Stack: 0.0004 318712 1. {main}() /srv/www/htdocs/global-unset.php:0 After successful_unset(): 

unset() weiß nichts über den globalen Gültigkeitsbereich in der ersten function; Die Variable wurde nur in den lokalen Namespace kopiert.


Alte Antwort

Aus wp-includes / query.php :

 function &query_posts($query) { unset($GLOBALS['wp_query']); $GLOBALS['wp_query'] =& new WP_Query(); return $GLOBALS['wp_query']->query($query); } 

Siehst du es?

BTW: Jemand hat ein schönes Flussdiagramm über dieses Thema erstellt. 😉

Aktualisieren

query_posts() ändert $GLOBALS während alle Verweise auf die Variable $wp_query , die Sie global zur Verfügung gestellt haben, nicht von $wp_query betroffen sind . Das ist ein Grund, $GLOBALS (neben der Lesbarkeit) vorzuziehen.

Haben Sie versucht, wp_reset_query(); nach Ihrer benutzerdefinierten Abfrage wie unter http://codex.wordpress.org/Function_Reference/query_posts beschrieben ?