it-swarm.com.de

query_posts () in function bringt globale $ wp_query aus der Synchronisation?

Das hat mich schon eine Weile ratlos gemacht. Entweder fehlt mir etwas sehr Offensichtliches oder etwas sehr Nicht-Offensichtliches. Ich bin mir auch nicht ganz sicher, ob dies etwas mit der WP oder nur 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:

boolean wahr

boolean false

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

4
Rarst

Update 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 Bereich in der ersten Funktion. Die Variable wurde nur in den lokalen Namespace kopiert.


Alte Antwort

Von 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?

Übrigens: Jemand hat ein Nettes Flussdiagramm zu genau diesem Thema erstellt. ;)

Aktualisieren

query_posts() ändert $GLOBALS, während alle Verweise auf die Variable $wp_query, die Sie für global zur Verfügung gestellt haben, von unsetnicht betroffen sind. Dies ist ein Grund, $GLOBALS zu bevorzugen (neben der Lesbarkeit).

4
fuxia

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

0
cwd