2012-06-22 3 views
3

이것은이 현재 그것에 매여 기능입니다 pre_get_posts 액션/필터

를 사용하여 메인 쿼리를 수정에서 내 첫 번째 시도 :

function advanced_product_search_filter($query) 
{ 
    if(!is_admin() && 
    is_main_query() && 
    is_search() && $query->query_vars['post_type'] == 'product') 
    { 
    $keyword = $_GET['s']; 

    if($_GET['exactly']) 
     $keyword = $_GET['s'] . ' "'. $_GET['exactly'] . '"'; 

    if($_GET['without']) 
    { 
     $excluded = exclude_product_keyword_search($_GET['without'], 
        $_GET['pname'], 
        $_GET['pcode'] 
       ); 
     $query->set('post__not_in', $excluded); 
    } 

    if($_GET['pname']) 
     $query->set('s', $keyword); 
    else 
     $query->set('s', ''); 

    if($_GET['pcode']) 
    { 
     $tax_queries = $query->get('tax_query'); 
     $tax_queries[] = array(
     array(
      'taxonomy' => 'pa_ordering-code', 
      'field' => 'name', 
      'terms' => array($keyword), 
      'operator' => 'LIKE' 
     ) 
    ); 
     $query->set('tax_query', $tax_queries); 
    } 
    } 
} 

WooCommerce 설치 위에 구축 된 플러그인입니다. WooCommerce 제품을 검색을 지원하는을 시도 그래서 기본적으로이 기능 중 하나를 표준 검색 (제목 및 내용) 또는 term_taxonomy 테이블의 코드 작품

다른 부분 pa_ordering-code입니다 Ordering Code라는 사용자 지정 특성에 대한 속성 검색을 통해 괜찮 으면, spost__not_in 바스를 아무 문제없이 수정할 수 있지만, tax_query을 사용하려고하면 쿼리가 무너지는 것 같습니다.

AND wp_posts.ID NOT IN (219) 
AND 0 = 1 
AND 
(
    (
    (wp_posts.post_title LIKE '%foo%') OR 
    (wp_posts.post_content LIKE '%foo%') 
) AND (
    (wp_posts.post_title LIKE '%foo bar%') OR 
    (wp_posts.post_content LIKE '%foo bar%') 
) 
) 
AND wp_posts.post_type = 'product' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
AND 
( 
    (
    wp_postmeta.meta_key = '_visibility' AND 
    CAST(wp_postmeta.meta_value AS CHAR) IN ('visible','search') 
) 
) 

을 주목 AND 0 = 1 :

?s=foo&post_type=product&pname=1&pcode=1&without=non&exactly=foo+bar 

WHERE 절을 덤핑 나는이 참조 :이 때

, 당신에게 아이디어를 제공하려면? JOIN 절을 덤프하면 tax_query 매개 변수가 postmeta 테이블 만 있기 때문에 올바르게 해석되지 않습니다. 아니요 terms, term_relationships 또는 term_taxonomy 테이블

그리고 나는 또한 단순히이 작업을 수행하여 기존의 tax_query (있는 경우) 덮어 쓰기를 시도 :

$args = array(
    array(
    'taxonomy' => 'pa_ordering-code', 
    'field' => 'name', 
    'terms' => array($keyword), 
    'operator' => 'LIKE' 
) 
); 
$query->set('tax_query', $args); 

하지만 여전히 작동시킬 수 없습니다. 내가 뭘 잘못하고 있는지에 대한 어떤 생각? 거짓include_children 매개 변수를 설정

답변

3

내 문제 해결 :

$args = array(
    array(
    'taxonomy' => 'taxonomy-name', 
    'field' => 'id', 
    'terms' => array(1, 2, 3, 4), 
    'include_children' => false, 
    'operator' => 'AND' 
) 
); 

오류가 tax_query에서 중첩 된 용어가있을 때 발생하는 것 같습니다 (예를 들어 2 일의 자식).

관련 문제