$ GLOBALS ['wp_the_query']とグローバル$ wp_query
-
-
あなたの質問に一行で答えるために、 `global $ wp_query`と言います!I would say `global $wp_query` just to answer your question in one line!
- 2
- 2016-03-14
- Sumit
-
違いはなんですか?What is the difference?
- 0
- 2016-03-14
- Nathan Powell
-
3 回答
- 投票
-
- 2016-03-14
$ 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']
/** * WordPressQueryオブジェクト * @global WP_Query $ wp_the_query * @since 2.0.0 */ $ GLOBALS ['wp_the_query']=new WP_Query(); /** * @see $ wp_the_queryへの参照を保持します *このグローバルをWordPressクエリに使用します * @global WP_Query $ wp_query * @since 1.5.0 */ $ GLOBALS ['wp_query']=$ GLOBALS ['wp_the_query'];
このようにする理由は、WordPressが
の到着を見たためです.バージョン1.5のquery_posts
.function query_posts($ query){ $ GLOBALS ['wp_query']=new WP_Query(); $ GLOBALS ['wp_query']を返す-> query($ query); }
ご覧のとおり、
query_posts
は、メインクエリオブジェクトを現在のカスタムクエリの通常の実行に設定します.これにより、メインクエリオブジェクトの整合性が失われ、誤ったデータが提供されるため、メインクエリオブジェクトに依存するものはすべて、誤ったデータが原因で壊れます.これに対抗する方法は、バージョン2.0.0で導入されたメインクエリオブジェクト
$ GLOBALS ['wp_the_query']
を格納する別のグローバルを作成することでした.この新しいグローバルは、メインクエリオブジェクトと$ GLOBALS ['wp_query']
のコピーのみを保持します.wp_reset_query()
を使用して、$ GLOBALS ['wp_query']
を元のメインクエリオブジェクトにリセットして整合性を復元できるようになりました.しかし、これは完璧な世界ではなく、
query_posts
は悪魔自身です.何千もの警告がありますが、人々は依然としてquery_posts
を使用しています.メインクエリを壊すことは別として、メインクエリを再実行するため、WP_Query
を使用した通常のカスタムクエリよりもはるかに遅くなります.また、多くの人は、完了時にwp_reset_query()
を使用してquery_posts
クエリをリセットしないため、query_posts
はさらに悪になります.それについては何もできず、プラグインとテーマによる
query_posts
の使用を停止できず、query_posts
クエリがwp_reset_queryでリセットされたかどうかを知ることができないためです. ()
、メインクエリオブジェクトのより信頼性の高いコピーが必要です.これにより、99.99999%の信頼性の高い正しいデータが得られます.ここで、$ GLOBALS ['wp_the_query']
は、WordPress関連のコードが値を変更できないため便利です(WP_Query
自体の内部のフィルターとアクションを除くem>).クイックプルーフ、以下を実行
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 <を使用しないと信じている場合/code>または正しく使用している場合は、
$ GLOBALS ['wp_query']
または$ wp_query
重要な編集
このサイトで数年間質問に答えていると、多くのユーザーが
$ wp_query
をローカル変数として使用しているのを目にしました.これにより、メインのクエリオブジェクトも壊れます.これにより、$ wp_query
の脆弱性がさらに高まります.例として、これを行う人もいます
$ wp_query=new WP_Query($ args);
これは本質的に
query_posts
が行っていることとまったく同じですYou have missed one,
$GLOBALS['wp_query']
. For all purposes,$GLOBALS['wp_query'] === $wp_query
.$GLOBALS['wp_query']
is however better for readability and should be used instead of$wp_query
, BUT, that remains personal preferenceNow, in a perfect world where unicorns rule the world,
$GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query
. By default, this should be true. If we look at where these globals are set (wp-settings.php
), you will see the main query object is stored in$GLOBALS['wp_the_query']
and$GLOBALS['wp_query']
is just a duplicate copy of$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'];
The reason for doing it this way, is because WordPress saw the arrival of
query_posts
in version 1.5.function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); }
As you can see,
query_posts
sets the main query object to the current custom query beign run. This breaks the integrity of the main query object, which gives you incorrect data, so anything that relies on the main query object is broken due to wrong data.A way to counter this was to create another global to store the main query object,
$GLOBALS['wp_the_query']
which was introduced in version 2.0.0. This new global hold the main query object and$GLOBALS['wp_query']
just a copy. Throughwp_reset_query()
, we could now reset$GLOBALS['wp_query']
back to the original main query object to restore its integrity.But this is not a perfect world, and
query_posts
are the devil himself. Although thousands of warnings, people still usequery_posts
. Apart from breaking the main query, it reruns the main query, making it much slower as a normal custom query withWP_Query
. Many people also do not reset thequery_posts
query withwp_reset_query()
when done, which makesquery_posts
even more evil.Because we cannot do anything about that, and cannot stop plugins and themes from using
query_posts
and we can never know if aquery_posts
query was reset withwp_reset_query()
, we need a more reliable copy of the main query object which we know will give us 99.99999% reliable, correct data. That is where$GLOBALS['wp_the_query']
is useful as no WordPress related code can change it's value (except through the filters and actions insideWP_Query
itself).Quick proof, run the following
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'] );
and check the results.
$GLOBALS['wp_the_query']
did not change, and$GLOBALS['wp_query']
has. So which is more reliable?Final note,
$GLOBALS['wp_the_query']
is NOT a replacement forwp_reset_query()
.wp_reset_query()
should always be used withquery_posts
, andquery_posts
should never be used.TO CONCLUDE
If you need reliable code which will almost always never fail, use
$GLOBALS['wp_the_query']
, if you trust and believe plugins and theme code and believe no one usesquery_posts
or is using it correctly, use$GLOBALS['wp_query']
or$wp_query
IMPORTANT EDIT
Being answering questions on this site now for a couple of years, I saw many users using
$wp_query
as a local variable, which in turn also breaks the main query object. This further increases the vulnerabilty of the$wp_query
.As example, some people to this
$wp_query = new WP_Query( $args );
which is in essence the exactly the same as what
query_posts
are doing-
[query_posts()](https://developer.wordpress.org/reference/functions/query_posts/)は `global $ wp_query`を変更します.`global $ wp_the_query`は、** [メインクエリ](https://developer.wordpress.org/reference/classes/wp_query/is_main_query/)**への参照を保持します[query_posts()](https://developer.wordpress.org/reference/functions/query_posts/) changes `global $wp_query`. `global $wp_the_query` holds the reference to **[the main query](https://developer.wordpress.org/reference/classes/wp_query/is_main_query/)**
- 1
- 2016-03-15
- Evan Mattson
-
私のコメントは訂正を意図したものではなかったので、訂正した場合はお詫びします.言及されていない `WP_Query ::is_main_query()`メソッドに関連する `$ wp_the_query`の最も重要な側面の1つであると私が信じていることを指摘しながら、私は単に要約していました(TL; DR).DMy comment wasn't intended as a correction, so my apologies if it did. I was merely summarizing (TL;DR if you will) while pointing out what I believe is one of the most significant aspects of `$wp_the_query` as it pertains to the `WP_Query::is_main_query()` method, which was not mentioned :D
- 0
- 2016-03-16
- Evan Mattson
-
@EvanMattson謝罪、私はあなたの最初のコメントを誤解しました;-).はい、 `is_main_query()`は `WP_Query ::is_main_query()`のラッパーであり、現在のクエリオブジェクトを `$ GLOBALS ['wp_the_query']`に保存されているメインクエリオブジェクトと照合します.これは、 `pre_get_posts`アクションを実行し、メインクエリをターゲットにする場合に非常に重要です;-)@EvanMattson Apologies, I misunderstood your first comment ;-). Yes, `is_main_query()`, which is a wrapper for `WP_Query::is_main_query()` which checks the current query object against the main query object saved in `$GLOBALS['wp_the_query']`. This is quite important when you run `pre_get_posts` actions and just want to target the main query ;-)
- 0
- 2016-03-16
- Pieter Goosen
-
かなりよくできた答えです!@EvanMattsonそれは[編集]だったはずです.Pretty well done answer! @EvanMattson That should have been an [edit].
- 0
- 2016-04-06
- kaiser
-
* IMPORTANTEDITセクションに `is_main_query`関数の言及を含めることができますか?今日は `pre_get_posts`を使用していましたが、` $ wp_query`を見ていたので、その関数を使用すると非常に便利であることがわかりました.Can you include mention of `is_main_query` function in the *IMPORTANT EDIT section? I was using `pre_get_posts` today and found it utterly useful to use that function since I was looking at `$wp_query`.
- 0
- 2017-03-18
- Nathan Powell
-
- 2016-03-14
globalキーワードは変数をローカルスコープにインポートしますが、$ GLOBALSは変数へのアクセスを許可するだけです.
詳しく説明すると、
と比較できます.global $wp_the_query;
を使用する場合 グローバルという単語を再度使用しなくても、ローカルスコープ内で$wp_the_query
を使用できます.したがって、基本的にglobal $wp_the_query
は$wp_the_query = $GLOBALS['wp_the_query']
編集
wp_queryをwp_the_queryと読み間違えたため、私の答えは質問に対する完全な答えではありませんが、
global $variable
と$GLOBALS['variable']
The global keyword imports the variable into the local scope, while $GLOBALS just grants you access to the variable.
To elaborate, if you use
global $wp_the_query;
you can use$wp_the_query
inside the local scope without using the word global again. So basicallyglobal $wp_the_query
can be compared to$wp_the_query = $GLOBALS['wp_the_query']
EDIT
I misread wp_query for wp_the_query so my answer isn't a complete answer to the question but still provides general information about the difference between
global $variable
and$GLOBALS['variable']
-
これは実際には元の質問に対する答えではないため、[編集]を提出してください.参考までに、 `$ GLOBALS ['foo']`は、変数のオーバーライドまたは設定解除も許可します.つまり、ここで説明するよりも_ビット_多くなります.Please, file an [edit] as this really is not an answer to the original question. Just FYI `$GLOBALS['foo']` allows _overriding_ or unsetting the variable as well. So it's a _bit_ more than what you describe here.
- 0
- 2016-04-06
- kaiser
-
- 2016-03-14
基本的に、一方は他方のコピーです.
wp-settings.php
<を確認してください./a>、行292-305:$GLOBALS['wp_the_query'] = new WP_Query(); $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
Basically one is copy of the other. Check out
wp-settings.php
, lines 292-305:$GLOBALS['wp_the_query'] = new WP_Query(); $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
$GLOBALS['wp_the_query']
とglobal $wp_query
の違いは何ですか?なぜ一方を他方よりも好むのですか?