query_posts () na função torna o $ wp_query global fora de sincronia?

4

Isso já me deixou perplexo por um tempo. Ou eu estou sentindo falta de algo muito óbvio ou algo muito não óbvio. Também não tenho certeza se isso tem algo a ver com WP ou com a mecânica puramente PHP no trabalho.

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

Resultado:

  

boolean true

     

booleano falso

Por que test() avalia isso para true , mas test2() avalia isso para false ?

    
por Rarst 02.04.2011 / 21:01

2 respostas

4

Atualizar com um exemplo melhor

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

Resultado

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() não sabe nada sobre o escopo global na primeira função; a variável foi copiada para o namespace local.

Resposta antiga

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

Você vê isso?

BTW: Alguém fez um bom fluxograma sobre esse mesmo tópico. ;)

Atualizar

query_posts() changes $GLOBALS , enquanto todas as referências à variável $wp_query disponibilizadas por global não são afetadas por unset . Esse é um motivo para preferir $GLOBALS (além de legibilidade).

    
por fuxia 02.04.2011 / 21:35
0

Você já tentou usar wp_reset_query(); após sua consulta personalizada, conforme descrito em enlace ?

    
por cwd 03.04.2011 / 16:46