私は自分でもこの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文を書き換えたいと思います。
なんらかのフィルターでできるのでは?と検索してこちらのページを見つけました
こちらでフィルターが分かりましたので、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 を追加するように書き換えます。
wp_サーバ引っ越しで起こった、検索ができないという理由と解決法
こちらの記事で教えていただきました。ありがとうございました。
この状態で
さくらエディタ で検索すると、
このように サクラエディタ も検索できるようになりました(^^)/
[amazon_searchlink search=”MySQL”]
コメント
コメント一覧 (4件)
[…] WordPress検索でカタカナとひらがなを同じように検索できるようにする […]
おぉ!なるほど。DBの文字コードが変わったからこれも変えないといけなかったですね!教えていただき、またご紹介いただきありがとうございます(^^)/。記事にも反映させます。
[…] 参考: WordPress検索でカタカナとひらがなを同じように検索できるようにする | RYUS blog […]
[…] 参考サイトWordPress検索でカタカナとひらがなを同じように検索できるようにする […]