하위 분류 항목을 제외하도록 분류 페이지를 수정하십시오.


18

이 질문을 찾았습니다.

pre_get_posts 필터에서 $ query-> set ( 'tax_query'를 사용하는 방법이 있습니까?

예, pre_get_posts ()를 통해 분류 아카이브에서 분류 쿼리를 변경할 수 있음을 나타냅니다. 그래서 나는 생각해 냈습니다.

add_action('pre_get_posts', 'kia_no_child_terms' );

function kia_no_child_terms( $wp_query ) {  
  if( is_tax() ) {
     $wp_query->tax_query->queries[0]['include_children'] = 0;
  }
}

만큼 잘

add_action('pre_get_posts', 'kia_no_child_terms' );

function kia_no_child_terms( $wp_query ) {
   if( is_tax() ) {
        $tax_query = $wp_query->get( 'tax_query' );
        $tax_query->queries[0]['include_children'] = 0;
    $wp_query->set( 'tax_query', $tax_query );  
    }    
}

include_children 매개 변수를 false로 설정하려고합니다 ... 그리고 생각할 수있는 두 가지의 모든 조합. 그러나 지금까지 분류 기록 보관소는 여전히 하위 용어로 항목을 표시합니다.

그리고 다음 테스트는 추가 세금 쿼리를 덮어 쓰지 않고 ADD에 추가하는 것 같습니다.

function dummy_test( $wp_query){
$tax_query = array(
             'relation' => 'OR',
             array(
               'taxonomy' => 'tax1',
               'terms' => array( 'term1', 'term2' ),
               'field' => 'slug',
             ),
             array(
               'taxonomy' => 'tax2',
               'terms' => array( 'term-a', 'term-b' ),
               'field' => 'slug',
             ),
           );


$wp_query->set( 'tax_query', $tax_query );

);
add_action('pre_get_posts','dummy_test');

SET이 현재 값을 덮어 쓰지 않아야합니까?


제발 이 답변 좀 봐 . 그것은 당신을 더 가져올 것입니다.
카이저

고마워요,하지만 그것은 제가 시도한 것입니다. $ wp_query 전역의 var_dumps / print_rs는 적어도 내 분류 체계 페이지 대신에 기존 쿼리 외에도 새로운 세금 쿼리를 보여줍니다.
helgatheviking

그러나이 코드는 쿼리에 추가됩니다.
카이저

기존 쿼리를 조정 / 재정의 할 방법이 없습니까? 내가 원하는 B / C는 include_children 매개 변수를 변경하는 것입니다
helgatheviking

답변:


22

나는 이것이 오래된 질문이라는 것을 알고 있지만 약간 혼란스럽고 희망적으로 누군가를 도울 것입니다. `$ query-> set가 작동하지 않는 이유는 쿼리가 이미 구문 분석되었으므로 tax_query 객체도 업데이트해야하기 때문입니다. 내가 한 방법은 다음과 같습니다.

function my_tax_query( $query ) {
    $package_id = 12345;
    $tax_query = array(
        'taxonomy' => 'package_id',
        'terms'    => array( $package_id ),
        'field'    => 'slug',
        'operator' => 'IN',
    );
    $query->tax_query->queries[] = $tax_query; 
    $query->query_vars['tax_query'] = $query->tax_query->queries;
}
add_action( 'pre_get_posts', 'my_tax_query' );

단!! 나는 이것을 체크 아웃하고 원래의 질문 인 모든 분류법에 대해 작동하도록 코드를 조정할 수있었습니다. +1 (가능한 경우 더 많은 투표를하겠습니다)
helgatheviking

이 방법이 날짜 쿼리에도 적용된다는 사실에 놀랐습니다.
David

14

Wordpress 3.7부터이 parse_tax_query목적을 위해 이름 이 지정된 새로운 작업 이 추가되었습니다.

function kia_no_child_terms($wp_query) {  
  $wp_query->tax_query->queries[0]['include_children'] = 0;
}
add_action('parse_tax_query', 'kia_no_child_terms');

이 후크는 query_vars 및 tax_query의 값을 수정합니다. 이 pre_get_posts방법을 사용하면 적어도 나에게 중복 분류법 쿼리가 발생했습니다.

3.7 이전 pre_get_posts에는 다른 답변에서 자세히 설명 된대로 작업을 대신 사용해야합니다 .


필자의 경우 이것은 너무 멀리 도달하여 의도하지 않은 부작용이 있습니다 ... 내 탐색의 하위 메뉴가 표시되지 않도록합니다.
Manu

2
@ Manu-당신은 완전히 정확합니다. 제공된 예제는 매우 단순하며 관련 변수 만 보여줍니다. 실제 시나리오 $wp_query에서는 먼저 쿼리를 수정해야하는지 여부를 확인하기 위해, 템플릿 태그 또는 둘 다 또는 다른 로직을 검사하거나 사용합니다.
leepowers

5

나는이 조합을 사용할 수 없습니다 pre_get_posts 또는 parse_query. 쿼리 객체를 만든 후에 지우면 비교적 쉽게 할 수 있습니다. 쿼리를 두 번 실행하고 있기 때문에 마음에 들지 않지만 "효율적"으로 노력하고 있습니다.

function kia_no_child_taxonomies(){

    if(is_tax()){
        $args = array(
            'tax_query' => array(
                array(
                    'taxonomy' => get_query_var('taxonomy'),
                    'field' => 'slug',
                    'terms' => get_query_var('term'),
                    'include_children' => FALSE
                )
            )
        );
        query_posts($args); 
    }
}

 add_action('wp','kia_no_child_taxonomies');

따라서 누군가가 더 나은 답변을 얻을 때까지 이것이 내가 지금까지 찾은 유일한 방법입니다.

편집하다:

@Tanner Moushey의 답변을 채택하여 마침내 pre_get_posts비효율적 인 이중 쿼리없이 후크 의 분류 아카이브에서 모든 하위 용어를 제외하도록이 작업을 수행 할 수있었습니다 .

function kia_no_child_taxonomies( $query ) {

    if( is_tax() ):

    $tax_obj = $query->get_queried_object();

   $tax_query = array(
                    'taxonomy' => $tax_obj->taxonomy,
                    'field' => 'slug',
                    'terms' => $tax_obj->slug,
                    'include_children' => FALSE
            );
   $query->tax_query->queries[] = $tax_query;
   $query->query_vars['tax_query'] = $query->tax_query->queries;

   endif;

}
add_action( 'pre_get_posts', 'kia_no_child_taxonomies' );

이것은 잘못이다. query_posts를 사용하지 말고 pre_get_posts를 사용하거나 요청하십시오.
kovshenin

도움이되지 않습니다. pre_get_posts를이 인스턴스에서 작동시키는 방법을 알고 있다면 왜 답변을 게시하지 않습니까? 필자가 시도한 질문에 분명히 게시했지만 해당 필터를 통해 tax_Query 객체를 수정할 수 없다는 결론에 도달했습니다.
helgatheviking

더 도움이 되었어야합니다. 따라서 실제 세금 조회는 pre_get_posts가 시작된 후 parse_tax_query로 작성되며 실제 WP_Tax_Query에는 조회 변수 (tax_query 조회 var 포함)에서 결합 된 모든 세금 조회가 포함되어 있으므로 귀하의 경우 tax_query 조회 var를 구문 분석합니다. 그런 다음 category, tag__in 등과 같은 쿼리 변수를 통해 사용 가능한 다른 항목을 추가하십시오. pre_get_posts를 사용하여 직접 추가하기 전에 기존 쿼리 변수를 제거 할 수 있습니다.
kovshenin

더 나은 설명을 주셔서 감사합니다. 분명히 이것은 오래되었으므로 내가 가진 해결책으로 나아갔습니다. 나는 후크를 include_children통해 매개 변수 를 수정할 수 없었습니다 pre_get_posts. 아 잘
helgatheviking

그래, 나는 오랫동안 여기에 없었습니다;)
kovshenin

2

나를 좋아하는 사람들은이 문제에 갇혀있어 유용한 것을 발견했습니다. 우선 순위 시스템을 사용했습니다

    function kia_no_child_taxonomies( $query ) {

if( is_tax() ):

$tax_obj = $query->get_queried_object();
$tax_query = array(
                'taxonomy' => $tax_obj->taxonomy,
                'field' => 'slug',
                'terms' => $tax_obj->slug,
                'include_children' => FALSE);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
return $query;
endif;

}
 add_action( 'pre_get_posts', 'kia_no_child_taxonomies',0 );

내 검색어가 결과에 포함되지 않았으며 제외 사항으로 검색이 중단되었습니다. 이것이 도움이되기를 바랍니다.

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