web-dev-qa-db-fra.com

query_posts () dans la fonction rend la synchronisation globale de $ wp_query?

Cela me laisse perplexe depuis un moment déjà. Soit il me manque quelque chose de très évident ou quelque chose de très peu évident. Je ne suis pas non plus tout à fait sûr de savoir si cela a quelque chose à voir avec la mécanique WP ou purement PHP au travail.

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();

Résultat:

vrai booléen

faux booléen

Pourquoi test() évalue-t-il cela à true, alors que test2() évalue cela à false?

4
Rarst

Mettre à jour avec un meilleur exemple

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";

Résultat

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() ne sait rien de la portée globale de la première fonction; la variable vient d'être copiée dans l'espace de noms local.


Ancienne réponse

De wp-includes/query.php :

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

Est-ce que tu le vois?

BTW: Quelqu'un a fait un organigramme Nice sur ce sujet même. ;)

Mettre à jour

query_posts() change $GLOBALS tandis que toutes les références à la variable $wp_query que vous avez rendues disponibles par global sont non affectées par unset . C’est l’une des raisons pour lesquelles préférer $GLOBALS (en plus de la lisibilité).

4
fuxia

Avez-vous essayé d'utiliser wp_reset_query(); après votre requête personnalisée, comme décrit à http://codex.wordpress.org/Function_Reference/query_posts ?

0
cwd