$ GLOBALS ['wp_the_query'] vsグローバル$ wp_query


回答:


27

あなたは1つを見逃しました$GLOBALS['wp_query']。すべての目的のために、$GLOBALS['wp_query'] === $wp_query$GLOBALS['wp_query']ただし、読みやすくするためには$wp_query、代わりに使用する必要がありますが、個人的な好みのままです

さて、ユニコーンが世界を支配する完璧な世界で$GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query。デフォルトでは、これは真である必要があります。これらのグローバルが設定されている場所(wp-settings.php)を見ると、メインのクエリオブジェクトが格納されて$GLOBALS['wp_the_query']おり$GLOBALS['wp_query']$GLOBALS['wp_the_query']

/**
 * WordPress Query object
 * @global WP_Query $wp_the_query
 * @since 2.0.0
 */
$GLOBALS['wp_the_query'] = new WP_Query();
/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global WP_Query $wp_query
 * @since 1.5.0
 */
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

この方法でこれを行う理由は、WordPressがquery_postsバージョン1.5で登場したためです。

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

ご覧のとおりquery_posts、メインクエリオブジェクトを現在のカスタムクエリの実行に設定します。これにより、メインクエリオブジェクトの整合性が失われ、誤ったデータが提供されるため、メインクエリオブジェクトに依存するものはすべて、誤ったデータのために破損します。

これに対抗する方法$GLOBALS['wp_the_query']は、バージョン2.0.0で導入されたメインクエリオブジェクトを格納する別のグローバルを作成することでした。この新しいグローバルは、メインクエリオブジェクトと$GLOBALS['wp_query']単なるコピーを保持します。を通じてwp_reset_query()$GLOBALS['wp_query']元のメインクエリオブジェクトにリセットして、整合性を復元することができました。

しかし、これは完全な世界ではなくquery_posts、悪魔自身です。何千もの警告がありますが、人々はまだを使用していますquery_posts。メインクエリを壊すこととは別に、メインクエリを再実行しWP_Queryます。これにより、通常のカスタムクエリと比べてはるかに遅くなります。また、多くの人query_postswp_reset_query()、完了時にクエリをリセットしませんquery_posts。これはさらに悪いことです。

私たちはそれについて何もできず、プラグインとテーマの使用を止めることができずquery_postsquery_postsクエリがでリセットされたかどうかがわからないため、wp_reset_query()99.99999%の信頼性があり、正しいとわかるメインクエリオブジェクトのより信頼性の高いコピーが必要ですデータ。それはどこで$GLOBALS['wp_the_query']ノーWordPressの関連するコードとして有用である(それの値を変更することができます内側フィルタと処置による以外WP_Queryそのもの)。

クイックプルーフ、次を実行

var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );

query_posts( 's=crap' );


var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );

結果を確認します。$GLOBALS['wp_the_query']変わらなかったし、$GLOBALS['wp_query']持っています。どちらがより信頼性が高いのでしょうか?

最後のメモ$GLOBALS['wp_the_query']は、の代わりではありませんwp_reset_query()wp_reset_query()必要があり、常に一緒に使用することquery_posts、およびquery_posts必要があります決して使用しないこと。

結論

あなたはほとんどの場合、使用することを失敗することはありません信頼性の高いコードが必要な場合は$GLOBALS['wp_the_query']、あなたが信頼し、信じているプラグインやテーマのコードを誰用途を信じていない場合、query_postsまたはそれを正しく使用しているが、使用$GLOBALS['wp_query']または$wp_query

重要な編集

数年前からこのサイトで質問に答えていると、多くのユーザー$wp_queryがローカル変数として使用していることがわかりました。これにより、メインのクエリオブジェクトも破損します。これにより、の脆弱性がさらに増加し​​ます$wp_query

例として、これに何人かの人々

$wp_query = new WP_Query( $args );

本質的には何query_postsをしているのとまったく同じです


1
query_posts()が変更されますglobal $wp_queryメインクエリglobal $wp_the_queryへの参照を保持しています
エヴァンマットソン

私のコメントは修正を意図したものではありませんでした。私は単に要約していましたが(TL;あなたがするならDR)、私はそれが言及されていない方法$wp_the_queryに関係しているので、最も重要な側面の1つであると信じていることを指摘しましたWP_Query::is_main_query():D
Evan Mattson

@EvanMattson謝罪、私はあなたの最初のコメントを誤解しました;-)。はい、は、現在のクエリオブジェクトをに保存されているメインクエリオブジェクトと照合is_main_query()するラッパーです。これは、アクションを実行し、メインクエリをターゲットにする場合に非常に重要です;-)WP_Query::is_main_query()$GLOBALS['wp_the_query']pre_get_posts
Pieter Goosen

かなりよくできた答えです!@EvanMattsonそれは編集する必要がありました。
カイザー

is_main_query*重要な編集セクションに機能の言及を含めることができますか?私が使っていたpre_get_posts今日、私は見ていたので、その機能を利用することが全く有用であることが判明しました$wp_query
ネイサンパウエル

2

基本的に、一方は他方のコピーです。wp-settings.php292行目から305行目を確認してください。

$GLOBALS['wp_the_query'] = new WP_Query();

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

2

globalキーワードは変数をローカルスコープにインポートしますが、$ GLOBALSは変数へのアクセスを許可するだけです。

詳しく説明すると、使用するglobal $wp_the_query; 場合は$wp_the_query、再びグローバルという単語を使用せずにローカルスコープ内で使用できます。だから基本的にglobal $wp_the_queryと比較することができます$wp_the_query = $GLOBALS['wp_the_query']

編集

私はwp_the_queryのwp_queryを読み違えているので、私の答えは質問に対する完全な答えではありませんがglobal $variable$GLOBALS['variable']


これは実際には元の質問に対する答えではないため、編集を提出してください。FYIだけで、変数のオーバーライドまたは設定解除も$GLOBALS['foo']許可されます。だから、だ少しより多くのあなたがここで説明するものより。
カイザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.