그것은 Codex에 있는 튜토리얼의 절반 과 블로고 스피어 query_posts()
와 절반의 사용과 비슷 합니다 WP_Query
. 거래는 무엇입니까?
그것은 Codex에 있는 튜토리얼의 절반 과 블로고 스피어 query_posts()
와 절반의 사용과 비슷 합니다 WP_Query
. 거래는 무엇입니까?
답변:
query_posts()
페이지의 기본 검색어를 새 검색어 인스턴스로 교체하여 페이지의 기본 검색어를 수정하는 것은 매우 단순하고 문제가있는 방법입니다. 비효율적이며 (SQL 쿼리를 다시 실행) 일부 상황에서 (특히 게시물 페이지 매김을 처리 할 때 자주) 실패합니다. 현대의 모든 WP 코드는 pre_get_posts
이러한 목적으로 후크 를 사용하는 것과 같이보다 안정적인 방법을 사용해야합니다 . TL; DR 은 query_posts ()를 사용하지 않습니다 .
get_posts()
사용법이 매우 유사하고 동일한 인수 (다른 기본값과 같은 뉘앙스 포함)를 허용하지만 게시물 배열을 반환하고 전역 변수를 수정하지 않으며 어디서나 사용하기에 안전합니다.
WP_Query
장면 뒤에서 두 가지 기능을 모두 수행하는 클래스이지만 자신 만의 인스턴스를 만들어서 작업 할 수도 있습니다. 조금 더 복잡하고 제한이 적으며 어디서나 안전하게 사용할 수 있습니다.
query_posts()
은에 대한 작은 래퍼 함수입니다 WP_Query
. 플로우 차트에 따라 추가되는 것은 전역 덮어 쓰기입니다.$wp_query
query_posts()
로하는 WP_Query
성능의 차이를 만들 것 그 핵심 부하의 일부이기 때문에, 원래 페이지의 쿼리는 여전히 실행됩니다. 템플릿 파일에 루프가없는 경우에도 해당 쿼리가 실행됩니다.
query_posts
하지 않고 이미 실행 한 후에 대체 합니다 . 메인 루프를 수정하는 가장 좋은 방법은 필터를 통하는 것 입니다. developer.wordpress.com/2012/05/14/…pre_get_posts
query_posts
-절대 사용해서는 안됩니다 query_posts
. @Rarst가 말한 것 외에도, 가장 큰 문제 query_posts
는에 저장된 주 쿼리 객체를 중단한다는 것 $wp_query
입니다. 많은 플러그인과 사용자 정의 코드는 기본 쿼리 개체에 의존하므로 기본 쿼리 개체를 분리하면 플러그인 및 사용자 정의 코드의 기능이 손상됩니다. 이러한 함수 중 하나만 모든 중요한 페이지 매김 함수이므로 주 쿼리를 중단하면 페이지 매김이 중단됩니다.
query_posts
어떤 템플릿에서 나쁜지 증명하기 위해 다음을 수행하고 결과를 비교하십시오.
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
및 WP_Query
구성하는 올바른 방법입니다 보조 (쿼리를 관련 게시물, 슬라이더 같은 내용 기능을 갖춘 정적 프론트 페이지 및 콘텐츠를 포함). 페이지 기능을 손상시킬 수 있으므로 홈 페이지, 단일 페이지 또는 모든 유형의 아카이브 페이지에서 기본 조회를 위해 두 가지 중 하나를 사용해서는 안됩니다. 기본 쿼리를 수정해야하는 경우 pre_get_posts
사용자 지정 쿼리가 아닌 수정을 사용하십시오 . ( 업데이트 : 정적 프론트 페이지 및 실제 페이지의 경우 실제 페이지 및 정적 프론트 페이지에서 pre_get_posts 사용 참조 )
기본적으로 WP_Query
기본 쿼리에 의해 사용되며 또한에 의해 사용 get_posts
되지만 get_posts()
사용 하지만 WP_Query
몇 가지 차이점이 있습니다.
get_posts
보다 빠릅니다 WP_Query
. 여백은 사이트의 총 게시물 수에 따라 다릅니다. 그 이유는,되어 get_posts
통과 'no_found_rows' => true
에 기본적으로 WP_Query
생략하는 / 법적 매김을 나누기. 으로 'no_found_rows' => true
, WP_Query
쿼리 게시물의 양을 얻는다 기본적으로, 그것은 더 매김을 계산하기 위해 쿼리와 일치하는 모든 게시물을 검색 할 경우, 다음, 밖으로 보석금.
이러한 이유로 get_posts()
페이지 매김이 아닌 쿼리에만 사용해야합니다. 페이지 매김 get_posts
은 실제로 하나의 큰 혼란입니다. WP_Query
페이지 매김 된 모든 쿼리에 사용해야합니다.
get_posts()
이러한 필터의 영향을받는 posts_*
필터의 영향을받지 않습니다 WP_Query
. 그 이유는 get_posts
기본적 'suppress_filters' => true
으로WP_Query
get_posts
같은 추가 매개 변수의 몇 가지를 가지고 include
, exclude
, numberposts
와 category
. 이 매개 변수는 WP_Query
에 전달되기 전에 유효한 매개 변수로 변경됩니다 WP_Query
. include
으로 변경됩니다 post__in
, exclude
로 post__not_in
, category
로 cat
와 numberposts
로 posts_per_page
. 그냥 참고, 모두 에 전달 될 수있는 매개 변수의 WP_Query
작동은 get_posts
, 당신은 할 수 무시하고 기본 매개 변수를 사용하지get_posts
get_posts
while 의 $posts
속성 WP_Query
만 WP_Query
반환하고 전체 객체 를 반환합니다. 이 객체는 조건부, 페이지 매김 및 루프 내에서 사용할 수있는 기타 유용한 정보와 관련하여 매우 유용합니다.
get_posts
루프를 사용하지 않고 foreach
게시물을 표시 하는 루프. 또한 기본적으로 템플릿 태그를 사용할 수 없습니다. setup_postdata( $post )
템플릿 태그를 사용하려면을 사용해야합니다. WP_Query
루프를 사용하고 기본적으로 템플릿 태그를 사용할 수 있습니다
get_posts
전달 'ignore_sticky_posts' => 1
에 WP_Query
있으므로, get_posts
기본이 끈적 게시물을 무시하여
사용 여부, 상기 내용을 토대로 get_posts
또는 WP_Query
당신에게 달려 있으며, 당신이 실제로 쿼리에서 무엇을해야합니까. 위의 내용은 귀하를 선택하도록 안내해야합니다
기본적인 차이점은 query_posts()
실제로 현재 루프를 수정하는 것입니다. 완료되면 루프를 재설정하고 즐거운 방법으로 보내야합니다. "query"는 기본적으로 함수에 전달하는 URL 문자열이기 때문에이 방법도 이해하기가 조금 더 쉽습니다.
query_posts('meta_key=color&meta_value=blue');
반면에, WP_Query
범용 도구에 가깝고 MySQL 쿼리를 직접 작성하는 것보다 훨씬 더 낫습니다 query_posts()
. 루프뿐만 아니라 어디서나 사용할 수 있으며 현재 실행중인 포스트 쿼리를 방해하지 않습니다.
나는 WP_Query
더 자주 사용하는 경향이 있습니다 . 실제로, 그것은 당신의 특정 사건으로 내려갈 것입니다.
사용할 필요는 없습니다 query_posts()
. 새로운 WP_Query 객체를 인스턴스화하고이 새로운 객체를에 다시 할당하기 만하면됩니다 global wp_query
.
참고로 다음은 실제 query_posts()
기능입니다.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
심층 사용자 지정 쿼리 스크립트를 만들려는 경우 고유 한 WP_Query 개체를 인스턴스화하십시오. 또는 get_posts()
여기저기서 약간의 조작 만하면됩니다.
어느 쪽이든, 나는 자신에게 호의를 wp_includes/query.php
베풀고 WP_Query
수업에 가고 묵상하는 것이 좋습니다 .
다른 쿼리 결과에도 영향을 미치므로 사용 wp_reset_query()
후 사용 하십시오 query_posts()
.