WP_Query와 query_posts () 및 get_posts ()를 언제 사용해야합니까?


답변:


667
  • query_posts()페이지의 기본 검색어를 새 검색어 인스턴스로 교체하여 페이지의 기본 검색어를 수정하는 것은 매우 단순하고 문제가있는 방법입니다. 비효율적이며 (SQL 쿼리를 다시 실행) 일부 상황에서 (특히 게시물 페이지 매김을 처리 할 때 자주) 실패합니다. 현대의 모든 WP 코드는 pre_get_posts이러한 목적으로 후크 를 사용하는 것과 같이보다 안정적인 방법을 사용해야합니다 . TL; DR 은 query_posts ()를 사용하지 않습니다 .

  • get_posts() 사용법이 매우 유사하고 동일한 인수 (다른 기본값과 같은 뉘앙스 포함)를 허용하지만 게시물 배열을 반환하고 전역 변수를 수정하지 않으며 어디서나 사용하기에 안전합니다.

  • WP_Query장면 뒤에서 두 가지 기능을 모두 수행하는 클래스이지만 자신 만의 인스턴스를 만들어서 작업 할 수도 있습니다. 조금 더 복잡하고 제한이 적으며 어디서나 안전하게 사용할 수 있습니다.


8
@jjeaton query_posts()은에 대한 작은 래퍼 함수입니다 WP_Query. 플로우 차트에 따라 추가되는 것은 전역 덮어 쓰기입니다.$wp_query
Rarst

7
교체 @jjeaton query_posts()로하는 WP_Query성능의 차이를 만들 것 그 핵심 부하의 일부이기 때문에, 원래 페이지의 쿼리는 여전히 실행됩니다. 템플릿 파일에 루프가없는 경우에도 해당 쿼리가 실행됩니다.
Rarst

116
이것이 WPSE에서 가장 독창적이고 공감 된 게시물이라는 느낌을 제거 할 수 없습니다. 코덱에도 있어야합니다.
kaiser

8
"query_posts ()의 성능"문제에 대한 가장 명확한 설명을 추가하겠습니다. 템플릿 파일에서 query_posts () 또는 WP_Query를 사용하면 수행 한 쿼리와 동일한 성능 비용이 발생합니다. 코덱스 기사에서 논의 된 문제는 실제로 쿼리를 바꾸려면 원래 query_posts ()를 'parse_query'필터로 필터링하여 수행해야한다는 것입니다. 그렇게하면 두 번째 쿼리를 수행하여 어색하게 대체하는 것이 아니라 원래의 바람직한 쿼리 만 있습니다. query_posts ()는 결코 길입니다! 못!
jerclarke

22
John James Jacoby가 developer.wordpress.com 블로그에 작성한 query_posts에 대한 놀라운 설명이 있습니다.이 답변은 모두 물 밖으로 빠져 나옵니다. 요점 : 메인 루프를 전혀 수정query_posts 하지 않고 이미 실행 한 후에 대체 합니다 . 메인 루프를 수정하는 가장 좋은 방법은 필터를 통하는 것 입니다. developer.wordpress.com/2012/05/14/…pre_get_posts
Dan Gayle 2016 년

65

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_postsWP_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, numberpostscategory. 이 매개 변수는 WP_Query에 전달되기 전에 유효한 매개 변수로 변경됩니다 WP_Query. include으로 변경됩니다 post__in, excludepost__not_in, categorycatnumberpostsposts_per_page. 그냥 참고, 모두 에 전달 될 수있는 매개 변수의 WP_Query작동은 get_posts, 당신은 할 수 무시하고 기본 매개 변수를 사용하지get_posts

  • get_postswhile 의 $posts속성 WP_QueryWP_Query반환하고 전체 객체 를 반환합니다. 이 객체는 조건부, 페이지 매김 및 루프 내에서 사용할 수있는 기타 유용한 정보와 관련하여 매우 유용합니다.

  • get_posts루프를 사용하지 않고 foreach게시물을 표시 하는 루프. 또한 기본적으로 템플릿 태그를 사용할 수 없습니다. setup_postdata( $post )템플릿 태그를 사용하려면을 사용해야합니다. WP_Query루프를 사용하고 기본적으로 템플릿 태그를 사용할 수 있습니다

  • get_posts전달 'ignore_sticky_posts' => 1WP_Query있으므로, get_posts기본이 끈적 게시물을 무시하여

사용 여부, 상기 내용을 토대로 get_posts또는 WP_Query당신에게 달려 있으며, 당신이 실제로 쿼리에서 무엇을해야합니까. 위의 내용은 귀하를 선택하도록 안내해야합니다


1
나는 내가 가장 좋아하는 답변을 원한다. 이것은 너무 많은 설명입니다.
Patrik Alienus 2012 년

1
대단한 설명! "get_posts ()는 페이지 매김되지 않은 쿼리에만 사용해야합니다. 페이지 매김 get_posts는 실제로 하나의 큰 혼란입니다. WP_Query는 모든 페이지 매김 된 쿼리에 사용해야합니다."기본적으로 모든 사람이 imo를 알아야합니다.
Bullyen

32

기본적인 차이점은 query_posts()실제로 현재 루프를 수정하는 것입니다. 완료되면 루프를 재설정하고 즐거운 방법으로 보내야합니다. "query"는 기본적으로 함수에 전달하는 URL 문자열이기 때문에이 방법도 이해하기가 조금 더 쉽습니다.

query_posts('meta_key=color&meta_value=blue'); 

반면에, WP_Query범용 도구에 가깝고 MySQL 쿼리를 직접 작성하는 것보다 훨씬 더 낫습니다 query_posts(). 루프뿐만 아니라 어디서나 사용할 수 있으며 현재 실행중인 포스트 쿼리를 방해하지 않습니다.

나는 WP_Query더 자주 사용하는 경향이 있습니다 . 실제로, 그것은 당신의 특정 사건으로 내려갈 것입니다.


15

사용할 필요는 없습니다 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수업에 가고 묵상하는 것이 좋습니다 .



10

올바르게 읽는 것을 기억한다면 본질적으로 "루프"는 WP_Query핵심 파일에서 수행되지만 이해하기 쉬운 방법입니다.


6
  • query_posts () : 기본 쿼리를 수정해야하는 경우에만 사용될 수 있습니다. 많은 전역 변수를 설정합니다.
  • get_posts () : 역학에서 매우 유사하며 동일한 인수를 허용하지만 게시물 배열을 반환합니다.
  • WP_Query : 자체 객체를 생성하고 사용할 수 있습니다. 조금 더 복잡하고 제한이 적으며 어디에서나 사용하는 것이 안전합니다.

-6

get_posts()플러그인에서 사용하지 말라고 말하고 싶습니다 . 경우에 따라 매우 제한적인 필터 (set 's suppress_filters, ignore_sticky_posts등)를 적용하므로 빠른 작업을 원할 때 테마에서만 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.