WordPress標準のサイト内検索では、中点(中黒)のありなしについても厳密に検索されます。
例えば、「プリズン・ブレイク」という単語が入った投稿を検索しようとして、「プリズンブレイク」とキーワードを入力してもヒットしません。
「プリズン・ブレイク」と中点まで入れるとヒットします。
この挙動は逆もまた然りです。「プリズンブレイク」を検索しようとして「プリズン・ブレイク」と入力してもヒットしません。もう少しあいまいにヒットしてくれても良いですよね。
そんな中点問題を解決してくれる内容が、WordPressのサポートフォーラムに投稿されていたので紹介したいと思います。
WordPressのサイト内検索で中点(中黒)のありなしに関わらずヒットさせる方法
サポートフォーラムでは検索時の中黒「・」についてというタイトルで質問が投稿されていました。回答者は、XO Featured Image Toolsなどのプラグインも開発しているishitakaさんです。
詳しくはフォーラムをご参照いただければと思いますが、結論だけ書くと以下の内容をfunctions.phpに追加すれば、中点のありなしに関わらず検索でヒットするようになります。
function my_posts_where( $where, $query ) {
global $wpdb;
if ( is_search() && $query->is_search() ) {
$s = $query->query['s'];
$s = str_replace( '・', '', $s );
$like = $wpdb->esc_like( $s );
$w =
"(REPLACE({$wpdb->posts}.post_title,'・','') LIKE '%{$like}%') OR " .
"(REPLACE({$wpdb->posts}.post_excerpt,'・','') LIKE '%{$like}%') OR " .
"(REPLACE({$wpdb->posts}.post_content,'・','') LIKE '%{$like}%') OR ";
$where = preg_replace( '/^(\sAND \(\()(.*\)\))/', '$1' . $w . '$2', $where );
}
return $where;
}
add_filter( 'posts_where', 'my_posts_where', 10, 2 );
REPLACE関数を使って中点を取り除いて検索しているわけですね。タイトル・本文・抜粋が検索対象になっています。
上記をfunctions.phpに追加することで、「プリズンブレイク」でも「プリズン・ブレイク」がヒットするようになりました。
あとがき
これは実務でも使えそうですね。検索機能をより強化したい時は、上述したカスタマイズをご検討ください。