WP_Query에서 여러 tax_query에 대한 다중 관계


10

WP_Query()클래스 를 사용하여 내 게시물 중 일부를 필터링하고 싶습니다. 내가 지금 직면하고있는 문제는 분류법 쿼리를 처리하는 것입니다. 일반적으로 WP_Query()하나의 관계 tax_query()(AND 또는 OR) 만 처리 하지만 필요한 것은에서 관계를 혼합하여 사용하는 것입니다 tax_query(). 어떻게 달성 할 수 있습니까?
예 :

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term)
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => 'terms' => array( $term3),
            'operator' => 'IN',
        )
       // below i want to use OR relationship
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4)
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => 'terms' => array( $term2),
            'operator' => 'IN',
        )
    )  

위의 코드가 작동하지 않는다는 것을 알고 있습니다. WP_Query()필터를 사용해야 합니까? 어떤 생각?

답변:


10

이것은 슬러그 대신 term_taxonomy_id를 사용하여 수행 할 수 있습니다.이 분류법은 지정된 분류 체계를 무시하고 고유 한 term_taxonomy_id 필드 만 살펴 봅니다. 이를 통해 효과적으로 혼합 관계를 수행 할 수 있습니다. AND의 전체 관계를 사용하고 IN 연산자를 사용하여 OR과 관련이있는 모든 용어를 하나의 항목에 넣기를 원합니다. 먼저 원하는 용어를 term_taxonomy_ids에 맵핑해야합니다.

$taxes = array( 'taxonomy1', 'taxonomy2', 'taxonomy3', 'taxonomy4' );

foreach ( $taxes as $tax ) {
    $terms = get_terms( $tax );

    foreach ( $terms as $term )
        $tax_map[$tax][$term->slug] = $term->term_taxonomy_id;
}


$args['tax_query'] => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'taxonomy1',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy1'][$slug] )
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy3',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy3'][$slug] ),
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy4', // gets ignored
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
        'operator' => 'IN',
    ),
);

3.5 이전 버전에서는을 지정해야합니다 'include_children' => false. 자세한 내용은 다음 Trac 티켓을 참조하십시오 : https://core.trac.wordpress.org/ticket/21228


6
그건 그렇고, 실례와 실수 / 실수에 대해 알려주십시오 :)이 한 손으로 다른 한 손으로 아기를 입력하십시오.
helenhousandi

1
어디 $slug에서 왔습니까?
vancoder

1
코드에서 자리 표시 자입니다. 원래 질문에서 $ term1 등이었던 것 같습니다.
helenhousandi

당신이 맞아요! 이 방법은 효과가있는 것 같습니다. 나는 그것을 시험 해보고 그것이 효과가 있다면이 답변에 투표하기 위해 다시 올 것이다. 감사합니다
ron_dev

'taxonomy' => 'taxonomy4', // gets ignored무시할 수없는 것 같습니다 . 이 필드에 임의의 텍스트를 입력하면 결과가 없습니다. 실제 분류 이름을 지정할 때만 결과가 나옵니다. 왜 그런지 알아?
ron_dev

1

이처럼 여러 연산자 및 / 및 연산자 tax_query로 사용 하는 것이 좋습니다.meta_query


훨씬 더 나은 제안. 위의 답변 후 얼마 후에 릴리스되었습니다.
FooBar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.