WP_Query와 함께 pre_get_posts 사용


24

나는 읽고 있었다 스티븐 해리스 에의 훌륭한 대답 이 질문 의 사용에 관한 WP_query(), query_posts()그리고 pre_get_posts.

그는 말한다 "pre_get_posts이 변경에 대한 필터이며, 모든 쿼리를. 그것은 대부분 단지의 주요 질의 '를 변경하는 데 사용됩니다."

?로 만든 특정 보조 쿼리 pre_get_posts 필터링 하는 데 사용할 수 있습니다 . 예.WP_Query

$my_secondary_loop = new WP_Query(...);
if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

도움을 주시면 감사하겠습니다.

답변:


23

가장 간단한 방법은 쿼리 바로 전에 작업을 추가하고 바로 후에 제거하는 것입니다.

add_action('pre_get_posts', 'some_function_in_functionsphp');
$my_secondary_loop = new WP_Query(...);
remove_action('pre_get_posts', 'some_function_in_functionsphp');

if( $my_secondary_loop->have_posts() ):
    while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post();
       //The secondary loop
    endwhile;
endif;
wp_reset_postdata();

편집하다

사용할 수있는 또 다른 기술은 자체 쿼리 변수를 설정하고 후크에서 확인하는 것입니다.

// tell WordPress about our new query var
function wpse52480_query_vars( $query_vars ){
    $query_vars[] = 'my_special_query';
    return $query_vars;
}
add_filter( 'query_vars', 'wpse52480_query_vars' );

// check if our query var is set in any query
function wpse52480_pre_get_posts( $query ){
    if( isset( $query->query_vars['my_special_query'] ) )
        // do special stuff

    return $query;
}
add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' );

그리고 템플릿에서 :

// set the query var (along with whatever others) to trigger the filter
$args = array(
    'my_special_query' => true
);
$my_secondary_loop = new WP_Query( $args );

너무 너무 감사합니다. 이것은 정말 도움이됩니다. 나는 항상 자신의 쿼리 변수를 설정할 수 있는지 궁금했습니다.
벤 피어슨

이 트릭을 보관 페이지에 어떻게 사용합니까? 보관 페이지에 대한 전체 쿼리를 다시 작성하고 싶지 않지만이 기술을 사용하고 싶습니다.
Rohit Pande

4

pre_get_posts 모든 게시물 쿼리에 대해 발생합니다.

  • get_posts ()
  • 새로운 WP_Query ()
  • 당신이 모르는 사이에 클라이언트가 설치 한 임의의 최근 게시물 위젯.
  • 모두

-@nacin

필터를 제외하지 않는 한 조건부 사용을 사용하면 is_main_query()필터가 새 WP_Query에서 실행됩니다.

특정 새 WP_Query 만 타겟팅하려는 경우이를 수행 할 방법이 없습니다.


Milo의 ​​기술은 어떻습니까? 나는 그것을 전에 본 적이 없다 ...
brasofilo

그의 기술은 효과가있을 것이다. 나는 그것을 pre_get_posts에 사용하지 않았지만 posts_where와 같은 다른 필터를 사용했습니다
Chris_O

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