web-dev-qa-db-ja.com

function内のquery_posts()はグローバル$ wp_queryを同期させないようにしますか?

これは私がもうしばらくの間失敗しています。私は非常に明白な何かまたは非常に明白でない何かを見逃しています。これがWPに関係しているのか、それとも純粋にPHPの仕事に関係しているのか、私には完全にはわかりません。

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

結果:

真偽値true

ブール値false

なぜtest()はそれをtrueと評価しますが、test2()はそれをfalseと評価しますか?

4
Rarst

より良い例で更新する

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

結果

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()は最初の関数のグローバルスコープについて何も知りません。変数はローカル名前空間にコピーされたばかりです。


古い答え

wp-includes/query.php から:

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

見ますか?

ところで:誰かが この素晴らしいトピックについて//Niceフローチャート を作成しました。 ;)

更新

query_posts()$GLOBALSを変更しますが、globalごとに利用可能にした変数$wp_queryへの参照はすべて unset によって影響を受けないです。 (読みやすさの他に)$GLOBALSを好む理由の1つがこれです。

4
fuxia

http://codex.wordpress.org/Function_Reference/query_posts に記載されているように、カスタムクエリの後にwp_reset_query();を使用してみましたか?

0
cwd