回答:
あなたは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_posts
はwp_reset_query()
、完了時にクエリをリセットしませんquery_posts
。これはさらに悪いことです。
私たちはそれについて何もできず、プラグインとテーマの使用を止めることができずquery_posts
、query_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
をしているのとまったく同じです
$wp_the_query
に関係しているので、最も重要な側面の1つであると信じていることを指摘しましたWP_Query::is_main_query()
:D
is_main_query()
するラッパーです。これは、アクションを実行し、メインクエリをターゲットにする場合に非常に重要です;-)WP_Query::is_main_query()
$GLOBALS['wp_the_query']
pre_get_posts
is_main_query
*重要な編集セクションに機能の言及を含めることができますか?私が使っていたpre_get_posts
今日、私は見ていたので、その機能を利用することが全く有用であることが判明しました$wp_query
。
基本的に、一方は他方のコピーです。wp-settings.php
292行目から305行目を確認してください。
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
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']
global $wp_query
あなたの質問に一行で答えるためだけに言うでしょう!