$ 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
대신 사용해야합니다.이제 유니콘이 세상을 지배하는 완벽한 세상에서
의 중복 사본입니다. <사전> <코드> /** * WordPress 쿼리 개체 * @global WP_Query $ wp_the_query * @ 2.0.0 이후 */ $ GLOBALS [ 'wp_the_query']=새로운 WP_Query (); /** * @see $ wp_the_query에 대한 참조 보유 * WordPress 쿼리에이 전역 사용 * @global WP_Query $ wp_query * @ 1.5.0부터 */ $ GLOBALS [ 'wp_query']=$ GLOBALS [ 'wp_the_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가
의 등장을 보았 기 때문입니다. 버전 1.5의 query_posts
function query_posts ($ query) { $ GLOBALS [ 'wp_query']=새로운 WP_Query (); return $ 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
는 never 여야합니다. 익숙한.결론
거의 항상 실패하지 않는 신뢰할 수있는 코드가 필요하다면
를 사용하세요.$ GLOBALS [ 'wp_the_query']
를 사용하세요. 플러그인과 테마 코드를 신뢰하고 믿고 아무도query_posts <를 사용하지 않는다고 생각한다면/code> 또는 올바르게 사용중인 경우
$ GLOBALS [ 'wp_query']
또는$ wp_query
중요한 수정 사항
2 년 동안이 사이트의 질문에 답하면서 많은 사용자가
$ 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`는 ** [themain 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`의 가장 중요한 측면 중 하나라고 생각하는 것을 지적하면서 (TL; DR) 요약했습니다.디My 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 사과,첫 번째 의견을 오해했습니다 ;-).예,`$ GLOBALS [ 'wp_the_query']`에 저장된 기본 쿼리 객체에 대해 현재 쿼리 객체를 확인하는`WP_Query ::is_main_query ()`의 래퍼 인`is_main_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
-
* IMPORTANT EDIT 섹션에`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;
를 사용하는 경우 global이라는 단어를 다시 사용하지 않고 로컬 범위 내에서$wp_the_query
를 사용할 수 있습니다.따라서 기본적으로global $wp_the_query
는$wp_the_query = $GLOBALS['wp_the_query']
수정
나는 wp_the_query에 대한 wp_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']`는 _overriding_ 또는 변수 설정 해제도 허용합니다.따라서 여기에서 설명하는 것보다 _bit_ 더 많습니다.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
,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
의 차이점은 무엇인가요?왜 하나를 다른 것보다 선호합니까?