web-dev-qa-db-ja.com

カスタム分類用語を検索に含める

2つのカスタム投稿タイプに2つのカスタム分類法を適用しました。サイドバーの用語リストは問題なく、それに関連するすべての投稿をリストします。ただし、特定の用語の1つを検索しても、その用語の投稿は表示されません。

例: http://dev.andrewnorcross.com/das/all-case-studies/ /「PQRI」という用語を検索

私は何もしません。何か案は?私はさまざまな検索プラグインを使用してみましたが、それらは私のカスタム検索パラメータを壊しているか、あるいは単に動作しません。

31
Norcross

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');

それはTag-Searchプラグインに基づいています: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

37
onetrickpony

これは標準のWordPress検索ですか?なぜなら は分類法を含まないようだ (カテゴリやタグのように標準的なものでさえない)。コードはpost_titlepost_contentで検索しますが、それ以外のものを含めたい場合は、posts_searchフィルターにフックする必要があります。

7
Jan Fabry

https://wordpress.stackexchange.com/a/5404/37612 上記のOnetrickponyの解決策を試してみましたが、これは素晴らしいことですが、問題が1つ見つかりました。 1つ小さな修正を加えます。

  1. 分類法のタイトルの文字列を検索した場合 - それは素晴らしい作品
  2. 分類法に特殊文字が含まれている場合ドイツ語の「ウムラウト」(ö、ä、ü)と特殊文字を使用したoe、ae、ue instedaの検索 - 分類法のスラッグに検索を追加する必要があります - OR t.slug LIKE '%".get_search_query()."%'

  3. 検索クエリと分類法フィルタの組み合わせを検索する場合 - これもうまく機能します

  4. しかし、問題は、分類フィルターのみを使用しようとした場合です。テキストが検索されない場合、検索フックは空の文字列をクエリに追加します。そのため、結果からすべての投稿が表示されます。フィルター分類単純なIFステートメントは問題を解決します。したがって、修正されたコード全体はこれになります(私にとっては問題なく動作します)。

関数custom_search_where($ where){
 global $ wpdb; 
 if(is_search()&& get_search_query())
 $ where。= "OR((t .name LIKE '% "。get_search_query()。"%' OR t.slug LIKE '% "。get_search_query()。"%')AND {$ wpdb-> posts} .post_status = 'publish ') "; [
 return $ where; 
} 
 
関数custom_search_join($ join){
 global $ wpdb; 
 if(is_search()&& get_search_query())
 $ join = "左結合{$ wpdb-> term_relationship} tr ON {$ wpdb->投稿} .ID = tr.object_id内部結合{$ wpdb- > term_taxonomy} tt ON tt.term_taxonomy_id = tr.term_taxonomy_id内部結合{$ wpdb-> terms} t ON t.term_id = tt.term_id "; 
 return $ join; 
} 
 function custom_search_groupby($ groupby){
 global $ wpdb; 
 
 //投稿IDでグループ分けする必要があります
 $ groupby_id = "{$ wpdb-> posts} .ID"; 
 if(!is_search()|| strpos($ groupby、$ groupby_id)!== false ||!get_search_query())return $ groupby; 
 
 // groupbyが空の場合、ours 
 if(!strlen(trim($ groupby)))return $ groupby_id; 
 
 //空ではなかった場合は、ours 
 $ groupbyを返します。 "、"。$ groupby_id; 
} 
 
 add_filter( 'posts_where'、 'custom_search_where'); 
 add_filter( 'posts_join'、 'custom_search_join'); 
 add_filter( 'posts_groupby'、 'custom_search_groupby'); 
6
Asped

Janと同じレベルの情報を持っています。プラグインで検索を拡張することも可能です。

おそらく すべて検索(Wordpress Plugin) はあなたが探しているものです。機能リストによると、現在はカスタム分類法をサポートしています。

3
hakre

私はonetrickponyからの答えは素晴らしいと思いましたが、それはどんな検索も単一の用語として扱い、また引用符で囲まれた検索フレーズを扱いません。これら2つの状況に対処するために、私は彼のコード(特に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');
2
Mojamba

私は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に置き換えるときに私のために働きました。

1
mroncetwice