ワードプレスの検索機能で検索揺らぎもある程度検索できるようにするために各投稿のPostメタを手動で設定して検索結果に含める方法をご紹介いたします。

検索揺らぎとは?

検索揺らぎとは、同じ意味の言葉の言いかえ、もしくはタイプミスも検索されるという事で、例えば「ビール」という言葉一つでも

beer
ビア
びーる
ビ-ル (ハイフンが半角)
ビ-ル(半角カタカナ)

等の検索揺らぎがあります。
ワードプレスの検索は、サーバーのデータベースの設定によってはひらがなカタカナを区別しませんが、beerとビアなどをビールと同じ検索語句として認識できません。

この為、任意の投稿の投稿付加データ(ポストメタ)にあらかじめユーザーが検索するであろう検索揺らぎを入力しておいて、それをワードプレスの検索結果に含めてしまえばある程度検索揺らぎを吸収できる形になります。

各投稿に検索揺らぎの検索語句を設定できる欄を作る

下記のコードはシンプルな入力欄を各投稿の下部に作成し、その入力内容を保存するコードです。
テーマのfunctions.phpに入力いただくと動作します。

add_action('add_meta_boxes', 'my_add_keyword_meta_boxes_function');
function my_add_keyword_meta_boxes_function() //メタボックスの追加
{
    add_meta_box('my_keyword_meta_boxes', '検索揺らぎ用キーワード設定', 'my_add_keyword_meta_boxes_function_draw', 'post');
}
function my_add_keyword_meta_boxes_function_draw($post)//メタボックスの内容
{
    $mykeyword_metabox_value = get_post_meta($post->ID, 'mykeyword_metabox_value', true );
     echo '<input type = "text" name = "mykeyword_metabox_value" style="width:100%" value = "'.$mykeyword_metabox_value.'" /><br>';
}

add_action('save_post', 'my_add_keyword_meta_boxes_saved');
function my_add_keyword_meta_boxes_saved($post_id)//メタボックスの内容保存
{
    if(isset($_POST['mykeyword_metabox_value']))
    {
        if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        {
            return;
        }
        update_post_meta($post_id, 'mykeyword_metabox_value', $_POST['mykeyword_metabox_value']); 
    }
}

各投稿の入力欄に下記のようにキーワードを記載できるようになりました。

メタボックスの検索揺らぎ用キーワードをワードプレスの検索に含める

この為に、検索前にメタクエリを追加し、その追加されたメタクエリのSQL文をANDではなくORに書き換えます。(一般的なキーワード検索に加えてメタボックスの内容を検索するようにするためです)

add_filter( 'pre_get_posts', 'my_keyword_meta_search_query');
function my_keyword_meta_search_query( $query ) {//検索前にメタクエリを追加
  if ( $query->is_search ) {
    $meta_query_args = array(
      array(
        'key' => 'mykeyword_metabox_value',
        'value' => $query->query_vars['s'],
        'compare' => 'LIKE',
      ),
    );
    $query->set('meta_query', $meta_query_args);
    add_filter( 'get_meta_sql', 'my_keyword_meta_replace_and_with_or' );
  };
}

function my_keyword_meta_replace_and_with_or( $sql ) {//追加されたメタクエリのSQL文をANDではなくORに書き換え
    if ( 1 === strpos( $sql['where'], 'AND' ) ) {
        $sql['where'] = substr( $sql['where'], 4 );
        $sql['where'] = ' OR ' . $sql['where'];
    }
    remove_filter( 'get_meta_sql', 'me_replace_and_with_or' );
    return $sql;
}

参考 How to make search include data from wp_postmeta?

ご参考になりましたら幸いです。

WordPress ワードプレスの検索の改造・カスタマイズ・機能追加のご依頼ご相談はWPドクターまでお気軽にお送りください