$ GLOBALS [ 'wp_the_query'] vs 글로벌 $ wp_query


16

차이점은 무엇이며 $GLOBALS['wp_the_query']그리고 global $wp_query?

왜 다른 것을 선호합니까?


2
나는 말을 global $wp_query한 줄에 귀하의 질문에 대답하기 위해 단지!
Sumit

차이점은 무엇입니까?
Nathan Powell

답변:


27

하나를 놓쳤습니다 $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을하고 있는 것과 똑같습니다.


1
query_posts () 변경 global $wp_query. 주요 질문에global $wp_the_query 대한 참조를 보유
Evan Mattson

내 의견은 정정을위한 것이 아니므로 사과드립니다. 나는 언급되지 않은 방법 $wp_the_query과 관련 하여 가장 중요한 측면 중 하나라고 생각하면서 (요약하면 TL; DR) 요약했다 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 편집 했어야했다 .
kaiser

is_main_query* 중요 편집 섹션 에 기능에 대한 언급을 포함시킬 수 있습니까 ? 나는 pre_get_posts오늘 사용하고 있었고 내가보고있는 이후 그 기능을 사용하는 것이 완전히 유용하다는 것을 알았습니다 $wp_query.
Nathan Powell

2

기본적으로 하나는 다른 하나의 사본입니다. wp-settings.php라인 292-305를 확인하십시오 .

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

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

2

전역 키워드는 변수를 로컬 범위로 가져 오는 반면 $ 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']


실제 질문에 대한 답변이 아니므로 수정 사항을 제출하십시오 . 그냥 참고로 $GLOBALS['foo']허용 오버라이드 (override) 또는뿐만 아니라 변수를 해제하기. 그래서 A의 조금 더 당신이 여기에서 설명하는 것보다.
kaiser
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.