WordPressのサイト内検索で中点(中黒)のありなしに関わらずヒットさせる方法

WordPressのサイト内検索で中点(中黒)のありなしに関わらずヒットさせる方法

WordPressのサイト内検索で中点(中黒)のありなしに関わらずヒットさせる方法

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に追加することで、「プリズンブレイク」でも「プリズン・ブレイク」がヒットするようになりました。

中点なしでも検索にヒット

あとがき

これは実務でも使えそうですね。検索機能をより強化したい時は、上述したカスタマイズをご検討ください。

この記事が気に入ったら
いいね!してね♪

Twitter で

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です