サイト内検索で濁音・半濁音アリナシの区別がつかない問題を解決する

全般

今回は、WordPressのサイト内検索機能で濁音や半濁音の有無の区別がついていない問題を修正する方法を紹介したい。

これにより、検索結果に意図したものとは全く無関係な記事がいくつも表示されてしまう現象を防ぐことができる。

WordPressの検索機能は日本語に弱い……

以前、全角スペースの問題についても話したが、WordPressは英語圏で作られたシステムのため、2バイト言語圏で使うには少々不便な箇所がある

今回は、また違った部分で困ったところが浮かび上がってきた。

例えば、映画についてのブログを運営していたとしよう。

キング・コング」についての記事をいくつか執筆した後、サイト内の検索機能のテストも兼ねて「コング」と入力して検索をかけた。そうしたら、なぜか「ロッキー」シリーズの記事まで検索結果に表示されてしまっている。

これは、WordPressの検索機能が「コング」と「ゴング」の区別を付けていないからだ。

これでは「ハルク」と「バルク」と「パルクール」の区別もつかないし、「ショーン」と検索したとき「ショーン・コネリー」も「クインシー・ジョーン」も引っかかってしまう。

これではいくらなんでも不便だろう。

MySQLの仕様が原因

さて、なぜこのような問題が起きているのだろうか?

上記の記事にも書かれている通り、この原因はWordPressのデータベースを管理する「MySQL」で設定されている言語に由来している。

MySQLで設定されている「utf8_general_ci」の言語テーブルでは、「大文字と小文字、清音と濁音と半濁音ひらがなとカタカナ」を区別しない仕様となっている。

そして、文字列を「LIKE」で検索しているのでこのようなアバウトな結果が返されているのだ。

確認方法

「ほんとぉ?」だとか「???」と思う人もいるかもしれないので、手っ取り早く確認する方法も解説する。

WordPressで動いているクエリを調べるには、ブラウザ備え付けのデベロッパーツールを使うよりWordPressのデバッグ系プラグインを使ったほうが手っ取り早い

まずは、下記のプラグインを導入しよう。

Query Monitor」以外にもいくつかあるが、ざっと調べた中ではこちらのプラグインがよさそうだと思った。

このプラグインを有効化すると、ブラウザの画面上に常に表示されているアドミンバーの「新規」と「管理メニュー」の間にこのような数列が4つほど並んでいる要素が追加されているはずだ。

上の画像の赤い枠で囲ったところにカーソルを合わせると、このようにドロップダウンでメニューがいろいろ出てくるので一番上の「クエリ」を押そう。

クエリを押すと、このようにブラウザの下からQuery Monitorのデバッグツールが出現し、現在のページで動いているすべてのクエリが上から順に一覧で表示される。

それではテストも兼ねて検索フォームに「あいうえお」と入力して検索し、検索結果ページでQuery Monitorのクエリを開いて、クエリのリストを上から順にスクロールしてみよう。

テーマやプラグインのクエリの影響で順序が前後する可能性もあるが、おそらく14番あたりでこのようなクエリが確認できるだろう。

上記の画像のように、WordPressがデータベースを検索するときは「LIKE」が使用されていることが確認できるはずだ。

つまり組み合わせのことを考えると、現在の状態では「あいうえお」だけでおそらく100通り以上の文字列を拾うことになるので、日本語を用いた検索の精度はとても低いと言わざるを得ない。

ちなみに上の画像で「AND wp_posts.post_type = ‘post’」となっているのは、サイト内検索のときに「投稿記事のみ」表示するようにカスタマイズしているからである。そのカスタマイズについてはこちらの記事で紹介している。

通常は「AND wp_posts.post_type IN (‘post’, ‘page’, ‘attachment’)」と表示される。

functions.phpで簡単に仕様を切り替えよう!

この仕様を変更するには、データベースの検索方式を「LIKE」から「LIKE BINARY」に変えてやればいい。ただ、素人がMySQLパネルを弄るのはちょっと危ない。

なので、「functions.php」に動作を切り替えるPHPコードを追加して解決しよう。

いちおう「テーマのための関数 (functions.php)」ファイルを編集する場所の開き方を説明しておきたい。

まずは管理者画面を開いて、左側のサイドバーにある「外観」にマウスカーソルを合わせ、展開されたら「テーマエディター」をクリックする。

テーマの編集」画面に入ったら、「スタイルシート (style.css)」があらかじめ表示されているはずだ。なので、右側のテーマファイルのバーから「テーマのための関数 (functions.php)」をクリックする。

このページが表示されているだろうか?

また、現在開いているfunctions.phpファイルが子テーマのものであるかどうかも確認しよう

子テーマであれば、テーマファイルバー内にダイアログが表示されるはずだ。

それじゃあやっていこう。

「LIKE」から「LIKE BINARY」に切り替えるコード

それでは、子テーマのfunctions.phpにこのPHPコードをコピペしてほしい。

PHPコード
// 検索方式を「LIKE」から「LIKE BINARY」へ変更するコード
function mycus_change_LIKE_BINARY_search( $where, \WP_Query $q ) {
    if ( $q->is_search() && $q->is_main_query() && ! $q->is_admin() ) {
        $where = str_replace( 'LIKE', 'LIKE BINARY', $where );
    }
    return $where;
}
add_filter( 'posts_where', 'mycus_change_LIKE_BINARY_search', 10, 2 );

このコードをコピペしてファイルを更新するだけで、以降のサイト内検索はすべて「LIKE BINARY」を使用するようになる。

str_replace」とはPHP関数のひとつで、「AをBに置き換えて配列・文字列に返す」という役割を持っている。

つまり、今回のPHPコードでは「LIKE」を「LIKE BINARY」に置き換えて「$where」に返したわけだ。

詳しく知りたければこちらを読んでみよう。

変わってるか確認してみよう

とりあえず、先ほどの手順と同じようにやってみよう。

検索フォームに「あいうえお」と入力して検索し、検索結果に飛んだらそのページのクエリを確認するだけだ。

このように検索方式が切り替わっていることを確認できただろうか?

先ほど確認したエリアが「LIKE」から「LIKE BINARY」に変化していたらOK。

ただし不便になる点もある……

さて、いいことだらけのように感じるカスタマイズではあるのだが、少々不便になる点も存在する。

それは、アルファベットの大文字と小文字・半角と全角の区別が厳格になるという点だ。つまり、完全一致で検索するようになるということだ。

簡単に例えると、「WINDOWS」と「windows」と「windows」はそれぞれ完全に区別されるようになってしまう。新聞記者でもないので全角英数を使う人はあまりいないと思うが、大文字と小文字が同じものとして扱われなくなるのは何とももどかしい。

また、ひらがなとカタカナも別物として扱われる。ただし、この点については漢字以外ごちゃ混ぜが問題は解決するので、些細なものだと感じる。

松本人志監督の「しんぼる」と「スーパーマンはアメリカのヒーローのシンボル」の両方の区別が付かずに検索結果に表示されることはなくなるのだから。

最後に

今回使用したPHPコードが何か悪さを起こすことは考えにくいが、WordPress自体のアップデートでなにか不具合をおこす可能性も無いとは言えないので注意したい。

また、今回導入したプラグイン「Query Monitor」については、今後使う予定がないと感じているなら削除しておいた方がよいだろう。使わないプラグインを放置したままにするのはあまり良くないからだ。


今回は、WordPressのサイト内検索における濁点・半濁点問題についての解決方法を解説した。

この些細な問題に気が付き、その修正を行っていると、やはりWordPressは英語圏で作られたものなんだなぁと実感した。なぜなら、英単語の大文字・小文字の区別くらいしかないからだ。

この記事が役に立つと嬉しい。