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


16

사용하는 방법 프로그래머 $query->set('tax_query', ...)pre_get_posts필터를? 예를 들어 다음 코드는 쿼리를 변경하지 않습니다. 나는 $ taxonomies 및 사용자 정의 검색을 작성하고 있습니다.

function custom_search_filter($query) {
        ...

        // array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN')
        $taxonomies = implode(',', $taxonomy_arr);

        // /wordpress/25076/how-to-filter-wordpress-search-excluding-post-in-some-custom-taxonomies

        $taxonomy_query = array('relation' => 'AND', $taxonomies);

        $query->set('tax_query', $taxonomy_query);
    }

    return $query; 
}


add_filter( 'pre_get_posts', 'custom_search_filter', 999 );

미리 감사드립니다.


1
WP_Query인수 설정 방법으로 객체를 전달하는 이유는 무엇 입니까?
t31os

예, 잘못되었습니다. 이제 문자열을 배열로 변환하기 위해 eval을 사용했습니다 (실제로 문자열이 안전하다는 것을 확신합니다). 감사.
José Pablo Orozco Marín

답변:


35

$query필터 의 변수는 WP_Query객체를 나타내 므로 WP_Query해당 객체의 속성을 설정하는 메서드에 새 객체를 전달해서는 안됩니다 .

당신의 코드를 복사 질문 잘못 내가 느끼는 필터를 사용했다가 문제의 핵심이다.

예, tax_query내에서 사용 할 수 있습니다 pre_get_posts(또는 유사 parse_request) 필터 / 액션.

예를 들면 다음과 같습니다.
검색어에 대한 사용자 지정 분류 체계를 지정하십시오 .

function search_filter_get_posts($query) {
    if ( !$query->is_search )
        return $query;

    $taxquery = array(
        array(
            'taxonomy' => 'career_event_type',
            'field' => 'id',
            'terms' => array( 52 ),
            'operator'=> 'NOT IN'
        )
    );

    $query->set( 'tax_query', $taxquery );

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

6
pre_get_posts 조치 내에서 tax_query를 설정하는 실제 예제를 제공 할 수 있습니까?
helgatheviking

$ tax_query는 중첩 배열을 포함하는 객체입니다. 중첩 배열로 객체를 재정의 할 수 없습니다.
AlxVallejo

3
$tax_query은 객체 $query가 아니지만 (의 인스턴스입니다 WP_Query).
t31os

2
이것이 tax_query를 완전히 무시하지 않습니까? tax_query arg의 현재 데이터에 $ taxquery를 추가해서는 안됩니까?
hot_barbara

@hot_barbara 그대로 있으면 tax_query를 덮어 씁니다. 이 버전은 대신 현재 쿼리를 추가합니다 : $ taxquery = array ( 'relation'=> 'OR', array ( 'taxonomy'=> 'career_event_type', 'field'=> 'id', 'terms'=> array ( 52), '연산자'=> 'NOT IN'));
람빌로

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