검색시 맞춤 분류 용어 포함


33

두 가지 사용자 지정 게시물 유형에 적용되는 두 가지 사용자 지정 분류법이 있습니다. 사이드 바의 용어 목록에는 문제가 없으며 관련된 모든 게시물이 나열됩니다. 그러나 특정 용어 중 하나를 검색해도 해당 용어가 포함 된 게시물이 표시되지 않습니다.

예 : http://dev.andrewnorcross.com/das/all-case-studies/ "PQRI"용어 검색

나는 아무것도 얻지 못한다. 어떤 아이디어? 다양한 검색 플러그인을 사용해 보았지만 사용자 정의 검색 매개 변수가 깨지거나 작동하지 않습니다.


1 월이 제안한 답변에 피드백을 추가 할 수 있습니까? 아마도 작업을 수행하는 플러그인을 찾고 있습니까?
hakre

나는 계획을 버렸다. 특정 영역의 다양한 요구에 따라 3 개의 개별 검색 기능을 만들었으므로 테스트 한 모든 플러그인이 해당 기능을 중단했습니다. 결국, 나는 고객이 검색 가능한 것을 원한다면 콘텐츠에 용어를 포함 시키라고 말했다.
Norcross

답변:


36

Search Everything 플러그인도 추천 하지만 WP의 검색 기능을 사용하여 이것을 구현하려면 Atom 테마에서 사용하는 코드가 있습니다.

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){
  global $wpdb;
  if (is_search())
    $where .= "OR (t.name LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')";
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

태그 검색 플러그인을 기반으로합니다 : http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23


1
검색에서 분류법 ID 배열을 제외하도록이 코드를 어떻게 수정할 수 있습니까?
HandiworkNYC.com

이러한 후크에 대한 필터 콜백은 2 개의 인수를 허용합니다 . 두 번째는 모두 참조로 전달되는 WP_Query 인스턴스입니다. 항상 주 쿼리를 참조하는 템플릿 함수가 아닌 모든 검사 is_search()또는 기타 WP_Query 메서드 호출 is_search() is_home()등은 항상 쿼리 인스턴스에서 직접 호출해야합니다 (예 : $query->is_search()인스턴스 변수의 이름이 $query콜백 서명에 있다고 가정) . 필터가 실행중인 쿼리가 아닙니다.
Evan Mattson

4
또한 공개적으로 사용 가능한 원시 검색 문자열을 SQL 쿼리에 직접 삽입하는 것은 좋지 않습니다. 권장 사항
Evan Mattson

나는이 그렇게 뭔가 대신 사용자 정의의 TR, TT 및 t 수정이 문제 사용 WPML alredy 사용하는 'T'때문에 일부 가입에 WPML와의 충돌을 가지고 추가 할 수있는 것처럼 것
Bobz


5

https://wordpress.stackexchange.com/a/5404/37612 위의 Onetrickpony 솔루션을 시도했지만 훌륭하지는 않았지만 문제가 하나 발견되어 작은 수정을 할 것입니다.

  1. 분류법의 제목에서 문자열을 검색하면 훌륭하게 작동합니다.
  2. 분류법에 독일어 "Umlauts"(ö, ä, ü)와 같은 특수 문자가 있고 특수 문자 사용에 대한 oe, ae, ue insteda를 검색하는 경우-분류법의 슬러그에 검색을 추가해야합니다. OR t.slug LIKE '%".get_search_query()."%'

  3. 검색어와 분류법 필터의 조합을 검색하는 경우에도 잘 작동합니다.

  4. 그러나 문제는 분류 필터 만 사용하려고 할 때입니다. 검색 후크는 텍스트를 검색하지 않으면 빈 문자열을 쿼리에 추가하므로 결과에서 모든 게시물 대신 결과에 모든 게시물을 얻습니다. 필터링 된 분류법. 간단한 IF 문은 문제를 해결합니다. 그래서 수정 된 코드는 모두 다음과 같습니다 (나에게 완벽하게 작동합니다!)

custom_search_where ($ where) { 
  글로벌 $ wpdb;
  if (is_search () && get_search_query ())
    $ where. = "OR ((t.name LIKE '%". get_search_query (). "%'또는 t.slug LIKE '%". get_search_query (). "%') AND {$ wpdb-> posts} .post_status = '게시') ";
  $ where를 반환;
}

custom_search_join ($ join) 함수 {
  글로벌 $ wpdb;
  if (is_search () && get_search_query ())
    $ join. = "왼쪽 가입 {$ wpdb-> term_relationships} tr ON {$ wpdb-> posts} .ID = tr.object_id INNER JOIN {$ wpdb-> term_taxonomy} tt ON tt.term_taxonomy_id = tr.term_taxonomy_id INNER JOIN { $ wpdb-> terms} t ON t.term_id = tt.term_id ";
  $ join을 반환;
}

custom_search_groupby ($ groupby) 기능 {
  글로벌 $ wpdb;

  // 게시물 ID를 기준으로 그룹화해야합니다
  $ groupby_id = "{$ wpdb-> posts} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) 반환 $ groupby;

  // groupby는 비어있었습니다.
  if (! strlen (trim ($ groupby))) 반환 $ groupby_id;

  // 비어 있지 않았다.
  $ groupby를 반환합니다. ",". $ groupby_id;
}

add_filter ( 'posts_where', 'custom_search_where');
add_filter ( 'posts_join', 'custom_search_join');
add_filter ( 'posts_groupby', 'custom_search_groupby');

3

나는 Jan과 같은 수준의 정보를 가지고 있습니다. 플러그인으로 검색을 확장하는 것이 가능하다는 것을 알고 있습니다.

아마도 모든 것을 검색 (Wordpress Plugin) 은 당신이 찾고있는 것입니다. 기능 목록에 따르면 이제 사용자 정의 분류법을 지원합니다.


모든 검색 플러그인 +1 예상대로 작동하고 표준 Wordpress 검색보다 더 많은 결과를 반환합니다.
PNMG

2

onetrickpony의 답변이 훌륭하다는 것을 알았지 만 모든 검색어를 단일 용어로 취급하며 따옴표로 묶인 검색어를 처리하지 않습니다. atom_search_where이 두 가지 상황을 처리하기 위해 그의 코드 (특히 함수)를 약간 수정했습니다 . 그의 코드의 수정 된 버전은 다음과 같습니다.

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){ 
    global $wpdb, $wp_query;
    if (is_search()) {
        $search_terms = get_query_var( 'search_terms' );

        $where .= " OR (";
        $i = 0;
        foreach ($search_terms as $search_term) {
            $i++;
            if ($i>1) $where .= " AND";     // --- make this OR if you prefer not requiring all search terms to match taxonomies
            $where .= " (t.name LIKE '%".$search_term."%')";
        }
        $where .= " AND {$wpdb->posts}.post_status = 'publish')";
    }
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

1

WooCommerce 장바구니 플러그인에서 동일한 문제가 발생합니다. 표준 포스트 태그가 아니기 때문에 사용자 정의 분류 용어 인 'product_tag'가 검색 결과에 포함되지 않습니다. 이 다른 StackOverflow 스레드에서 문제에 대한 해결책을 찾았습니다.

https://stackoverflow.com/questions/13491828/how-to-amend-wordpress-search-so-it-queries-taxonomy-terms-and-category-terms

tkelly 의 코드 예제 는 카트 플러그인에 대한 필요에 따라 author그의 예제 에서 용어 를 대체 할 때 나를 위해 일했습니다 product_tag.

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