답변:
하나를 놓쳤습니다 $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
기본 쿼리 개체를 현재 사용자 지정 쿼리 beign 실행으로 설정합니다. 이로 인해 기본 쿼리 개체의 무결성이 손상되어 잘못된 데이터가 제공되므로 잘못된 데이터로 인해 기본 쿼리 개체에 의존하는 모든 것이 손상됩니다.
이를 방지하는 방법 $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']
더 워드 프레스 관련 코드는 (그것의 값을 변경할 수 유용 내부의 필터와 행동을 통해 제외하고 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
과 관련 하여 가장 중요한 측면 중 하나라고 생각하면서 (요약하면 TL; DR) 요약했다 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'];
전역 키워드는 변수를 로컬 범위로 가져 오는 반면 $ GLOBALS는 변수에 대한 액세스 권한 만 부여합니다.
좀 더 자세히 설명하면 global이라는 단어를 다시 사용하지 않고도 로컬 범위 내에서 사용할 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
한 줄에 귀하의 질문에 대답하기 위해 단지!