ワードプレスの検索機能のカスタマイズ、AND検索とOR検索

WordPressにはデフォルトの組み込みの検索機能がありますが、そのままだと、速度が遅く、機能に柔軟性がありません。 そこで、サイトの検索システムを強化し、より魅力的なものにするためカスタマイズを試みました。

検索の方法の基礎

WordPressのサイト内検索機能は、デフォルトではAND検索になります。

まずはAND検索とOR検索の違いについておさらいします。
■OR検索→いずれかの検索ワードが1つでも含まれていたらヒット
※OR検索は、あいまい検索とも言われたりします。
■AND検索→すべての検索ワードが含まれていればヒット

例えば複数検索で・・・
検索対象:「吾輩は猫である」
検索ワード:「吾輩 犬」
この場合、OR検索はヒットしますが、AND検索ではヒット判定になりません。

もう一つ、例えば「テスト」と「テスト試験」という投稿があり、「テスト 試験」で複数検索します。
■AND検索は、”テスト”と”試験”の両方を含む 「テスト試験」の投稿のみがヒット。
■OR検索は、”テスト”と”試験”のいずれかを含む「テスト」と「テスト試験」の両方の投稿がヒット。

もう一つ、例えば「パスタ」と「外食」を含む投稿が多数あり、「パスタ 外食」で複数検索します。
■AND検索は、「パスタ」と「外食」の両方を含む 投稿がヒット。絞られるのでヒット数は少ない。
■OR検索では、「パスタ」と「外食」のいずれかを含む投稿がヒット。全部出るのでヒット数は多くなる。

WordPressの検索機能

冒頭でも書いたようにWordPressでは検索ウィジェットというものが初めから利用できるようになっています。実際にWordPressメニューから「外観」ー>「ウィジェット」を開いてみると「検索」というウィジェットが見つかるはずです。そしてそれは下の画像の通りタイトルしか設定できない本当にシンプルなものです。

そして検索ウィジェットをサイドバーなどに設置してみると、これまた次のようなシンプルな検索バーが表示されます。

検索キーワードを入れれば、該当する検索結果ページが表示されるので必要最低限の検索機能はあります。

WordPress検索の問題点

以下の問題点がありますが、これだとユーザーが求める情報が見つかりにくく、PVを増やすチャンスをみすみす逃してしまうかもしれませんよね。

1.完全一致検索(AND検索)

デフォルトでは完全一致検索(AND検索)なのでキーワードに完全一致しないと結果が表示されません。※長いキーワードは、正確に入力しないとヒットしにくい。
※あいまい検索(OR検索)と選択にできないか。
※ただし、OR検索は結果が沢山出てきすぎる傾向にある。

2.複数キーワードは、半角スペースで区切る

複数キーワードは、半角スペースで区切る場合にしか対応していません。※全角スペースで検索すると結果は「NOT FOUND」で何も表示されません。気が付かないユーザーは多い。
※全角と半角を切り替えなくてはいけないので非常に不便!

3.検索にカテゴリ名ーは含まない

検索にカテゴリ名ーは含まないが、含むか含まないかを選択できればいいと思う。

4.ひらがなとカタカナは、区別して検索

ひらがなとカタカナは、区別して検索してしまうが、できれば、どちらでもヒットする仕様にしてほしい。

5.ひらがなと漢字は、区別して検索

ひらがなと漢字は、区別して検索してしまうが、できれば、どちらでもヒットする仕様にしてほしい。

6.異なる意味でも検索されてしまう

魚の「ぶり」を検索したいのに、「久しぶり」が選ばれてしまう。

WordPress検索の問題点の解決方法

1.完全一致検索(AND検索)

OR検索に変更できます。下記のコードをfunctions.phpに追加します。

function custom_or_search($search) {
  return str_replace(')) AND ((', ')) OR ((', $search);
}
add_filter('posts_search', 'custom_or_search');

これで、検索実行時のWHERE句で”AND”と”OR”を書き換えることで、検索方法をANDからORに変更しています。
■未対応
※OR検索にすると結果が沢山出てきてしまい使いにくいものになってしまうので…

2.複数キーワードは、半角スペースで区切る

1)プラグインを入れる。「WP Multibyte Patch」
■対応済み

2)または下記のコードをfunctions.phpに追加します。

実装は簡単で、下記のコードをfunctions.phpに追加します。
■未対応

//検索全角スペース対応
function empty_search( $query ) {
if ( $query->is_main_query() && $query->is_search && ! $query->is_admin ) {
$s = $query->get( 's' );
$s = str_replace(' ',' ', $s );
$query->set( 's', $s );
}
}
add_action( 'pre_get_posts', 'empty_search' );

3.検索にカテゴリー名は含まない

WordPressの記事検索にカテゴリ名・タグ名を含めるには、以下のfunctions.phpにコードを記述

//-----------------------------------------------------
// 検索対象にカテゴリを含める
//-----------------------------------------------------
function custom_search($search, $wp_query) {
    global $wpdb;
    //検索ページ以外
    if (!$wp_query->is_search)
    return $search;
    if (!isset($wp_query->query_vars))
    return $search;
    $search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
    if ( count($search_words) > 0 ) {
        $search = '';
        foreach ( $search_words as $word ) {
            if ( !empty($word) ) {
                $search_word = $wpdb-> _escape("%{$word}%");
                $search .= " AND (
                        {$wpdb->posts}.post_title LIKE '{$search_word}'
                        OR {$wpdb->posts}.post_content LIKE '{$search_word}'
            /*タグ名・カテゴリ名を検索対象に含める記述 start*/
                        OR {$wpdb->posts}.ID IN (
                            SELECT distinct r.object_id
                            FROM {$wpdb->term_relationships} AS r
                            INNER JOIN {$wpdb->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id
                            INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id
                            WHERE t.name LIKE '{$search_word}'
                        OR t.slug LIKE '{$search_word}'
                        OR tt.description LIKE '{$search_word}'
                        )
          /*タグ名・カテゴリ名を検索対象に含める記述 end*/
                ) ";
            }
        }
    }
    return $search;
}
add_filter('posts_search','custom_search', 10, 2);

上記コードをfunctions.phpに記述するだけでOKです。
■対応済み

すでに他の検索対象を含める記述・プラグインを実装してる場合、バッティングでエラーになる場合があるので注意してください。

4.ひらがなとカタカナは、区別して検索してしまう。

実装は簡単で、下記のコードをfunctions.phpに追加します。

function change_search_char($where, $obj) {
  if ($obj->is_search) {
    $where = str_replace(".post_title", ".post_title COLLATE utf8_unicode_ci", $where );
    $where = str_replace(".post_content", ".post_content COLLATE utf8_unicode_ci", $where );
  }
  return $where;
}
add_filter( 'posts_where', 'change_search_char', 10, 2 );

これで、「ひらがな」と「カタカナ」、「全角英数」と「半角英数」を区別せずに検索することができます。
■すでに対応済み?

5.ひらがなと漢字は、区別して検索してしまう。

今のところ対応は難しい。
■未対応

6.異なる意味でも検索されてしまう

魚の「ぶり」を検索したいのに、「久しぶり」が選ばれてしまう。
■未対応

参考:検索の種類

なのでそうならないためには最低限の検索機能に加えて、次のような機能もあると読者にとっても使いやすいブログになると思います。

  • あいまい検索
    全角と半角、大文字と小文字などを区別しないで検索できる機能のこと
  • カテゴリーやタグの絞り込み
    ある特定のカテゴリーやタグなどで検索結果を絞り込めれば利便性UP
  • 検索キーワードが拾える
    どんなキーワードが検索されたか把握できれば記事づくりのネタ探しにも効果的

ユーザーが情報を探しやすくしたりキーワードを把握できたりすればブログをさらにいい方向に改善できるので検索機能の強化は必須です。

スポンサーリンク

※記事を最後までお読みいただきありがとうございました。

くま吉

2010年から「ビジネスサイト制作教室」を主宰してきた現役ウエブデザイナーです。多くの生徒さんと一緒に、ワードプレスによるサイト作りに携わった経験を生かしてこの講座を始めました。

くま吉をフォローする
ワードプレス
くま吉をフォローする
ワードプレス、アドセンス、PCの使い方、MLB情報

コメント