当サイトには広告が含まれております

WordPress検索でカタカナとひらがなを同じように検索できるようにする

この記事は最終更新日から7年経過しています。内容が古い可能性があります。

私は自分でもこのblogを参照することが多くて、検索窓から入力してページを探しています。先日、絶対にあるはずのページのキーワードを入力したのにページが見つからず、どうして?ということがありました。
カタカナとひらがなの違いで検索できなかったようなのですが、googleのようにひらがなでもカタカナでも同じように検索してくれるようにできないかな?と思い、ちょっとカスタマイズしてみましたのでそれについて書きます。

記事をざっと見る

あれ?確実に書いたおぼえがあるのに見つからない…

先日、お勧めエディタはこれですーと紹介しようとしたのですが、

さくらエディタ と入力して検索すると

見つかりません になってしまいます。あれ?絶対に書いたはずなのになんでヒットしないんだろう…と、別のキーワード フリーソフト エディタ で検索すると、

見つかりました…なるほど さくらエディタ ではなく サクラエディタ だったんですね。Google検索等で慣れているとカタカナでもひらがなでもどっちでもいいかと思ってしまいますが、WordPressの検索はカタカナはカタカナでないとヒットしないようです。

カタカナでもひらがなでもヒットする方法を検索してみた

mysql ひらがな カタカナ 区別しない でググってみました。

【MySQL】大文字小文字、全角半角区別しないでマッチする検索をしたい

こちらのサイトを参照させていただきました。検索するときのSQL文のitemに collate utf8_unicode_ci とつければ、ひらがなでもカタカナの検索をしてくれそうです。

ということは検索の時のSQL文を書き換えればOKそうです。

WordPressで検索をしているSQL文を参照する

ここで前回のblogが出てくるんですが(^_^;、「XAMPPでMySQLのログを各バージョン別で確認する方法」で、検索したときのSQL文を確認しました。

SELECT SQL_CALC_FOUND_ROWS  wordpress_posts.ID FROM wordpress_posts  WHERE 1=1  AND (((wordpress_posts.post_title LIKE '%さくらエディタ%') OR (wordpress_posts.post_content LIKE '%さくらエディタ%')))  AND wordpress_posts.post_type IN ('post', 'page', 'attachment', 'mtssb_article', 'faq') AND (wordpress_posts.post_status = 'publish' OR wordpress_posts.post_author = 1 AND wordpress_posts.post_status = 'private')  ORDER BY wordpress_posts.post_title LIKE '%さくらエディタ%' DESC, wordpress_posts.post_date DESC LIMIT 0, 16

このようなものでした。入力した文字列でタイトルと本文を検索しているようです。

このSQL文をphpMyAdminのSQLタブで実行してみると、

返り値が空でした となります。今がこの状態ですね。

このSQL文にcollate utf8_unicode_ci を追加してみます。

SELECT SQL_CALC_FOUND_ROWS  wordpress_posts.ID FROM wordpress_posts  WHERE 1=1  AND (((wordpress_posts.post_title COLLATE utf8_unicode_ci LIKE '%さくらエディタ%') OR (wordpress_posts.post_content COLLATE utf8_unicode_ci LIKE '%さくらエディタ%')))  AND wordpress_posts.post_type IN ('post', 'page', 'attachment', 'mtssb_article', 'faq') AND (wordpress_posts.post_status = 'publish' OR wordpress_posts.post_author = 1 AND wordpress_posts.post_status = 'private')  ORDER BY wordpress_posts.post_title COLLATE utf8_unicode_ci LIKE '%さくらエディタ%' DESC, wordpress_posts.post_date DESC LIMIT 0, 16

こんな感じ。SQL文をphpMyAdminのSQLタブで実行してみると、

1件検索結果が出ました。これでOKそうです。

WordPressのsearchのwhere文を書き換える

どのように書き換えるかは分かったので今度はWordPressの検索をしたときのwhere文を書き換えたいと思います。

なんらかのフィルターでできるのでは?と検索してこちらのページを見つけました

WordPressのデフォルトの検索をカスタマイズする

こちらでフィルターが分かりましたので、collate utf8_unicode_ci を追加するように書き換えてみます。

使っている子テーマの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 );

これを追加します。posts_where フィルターはWordPressCodexによると「post 配列を返すクエリの WHERE 節に適用される」もののようです。

$obj->is_search検索結果のページだったらという絞り込みをしておいて、そのときだけwhere文をcollate utf8_unicode_ci を追加するように書き換えます。

※ データベースの文字コードがutf-8でない場合はこのコードでは検索ができないようでした。トラックバックで教えていただきました。collate utf8_unicode_ci という部分を collate utf8mb4_unicode_ci と変更するとその場合でも検索できるようです。

wp_サーバ引っ越しで起こった、検索ができないという理由と解決法

こちらの記事で教えていただきました。ありがとうございました。

この状態で

さくらエディタ で検索すると、

このように サクラエディタ も検索できるようになりました(^^)/

[amazon_searchlink search=”MySQL”]

この記事が気に入ったら
いいね または フォローしてね!

あなたのシェアが励みになります!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (4件)

コメントを残す

記事をざっと見る