サイト内検索のとき「タイトル」のみで探すようにするカスタマイズ

全般

今回は、WordPressのサイト内検索機能の単語の捜索範囲を「記事タイトル」に限定する方法を紹介したい。

検索結果があまりにも広すぎると感じているならおすすめのカスタマイズになる。

スポンサーリンク

WordPressのサイト内検索は記事のどこを探しているのか?

以前、WordPressのサイト内検索では濁音や半濁音といった日本語の細かい違いの区別が付いていないことと、その解決方法を解説した。

このとき、「Query Monitor」というプラグインを使用してWordPressがサイト内をどのように調べているのか、つまり検索に使われているクエリを閲覧する方法を紹介した。

その方法を使って、もう一度検索結果ページ上で動いているWordPressの検索クエリを覗いてみよう。

上の画像の赤枠で囲った部分が、投稿された記事のどの場所から検索ワードを拾っているのかを表記している部分となる

  • wp_posts.post_title
    記事タイトルを捜索している部分。
  • wp_posts.post_excerpt
    抜粋オプションを捜索している部分。こちらはあまり関係ない
  • wp_posts.post_content
    記事本文を捜索している部分。

つまり、WordPressはサイト内検索でデータベースを探すとき、上記の3つの場所から検索ワードを拾ってきているというわけだ。

そして、今回のカスタマイズはこれを記事タイトルだけに限定するカスタマイズを行っていくことになる。

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

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

functions.phpを編集して簡単に仕様変更!

さて、先ほどの説明でWordPressが検索ワードを探している部分がわかったはずだ。

これを「post_title」に限定するPHPコードを「functions.php」に入力しよう。

テーマのための関数 (functions.php)」ファイルは、管理者画面左側の「外観」のメニュー内にある「テーマエディター」内に存在している。

「スタイルシート (style.css)」があらかじめ表示されている場合は、右側のテーマファイルバーから探そう。

また、編集しようとしているファイルが子テーマのものかどうかも忘れずに確認しよう

子テーマのfunctions.phpの場所は確認できただろうか?

それでは、やっていこう。

タイトルのみに制限するコード

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

PHPコード
// サイト内検索の捜索範囲を記事タイトルに限定するコード
function mycus_title_only_search( $where, \WP_Query $q ) {
    if ( $q->is_search && $q->is_main_query() && ! $q->is_admin() ) {
        $where = str_replace( array('excerpt','content'), array('title','title'), $where );
    }
    return $where;
}
add_filter( 'posts_where', 'mycus_title_only_search', 10, 2 );

このコードをコピペしてファイルを更新するだけで、以降のサイト内検索はすべて記事タイトルのみで探すようなる。

確認してみよう

それでは、先ほどのコードがちゃんと動いているかどうかQuery Monitorで確認してみよう。

この通り、みっつすべて「wp_posts.post_title」になっていたらOK。タイトルのみ検索するように切り替わっている。

ちなみに、WordPressのデータベース検索仕様を「LIKE」から「LIKE BINARY」に変更するカスタマイズを行っている場合でも問題なく機能する。

このように「LIKE」と表示されている場所が「LIKE BINARY」に変わるだけだ。

解説

このコードが行っている動作は、「wp_posts.post_excerpt」と「wp_posts.post_content」をクエリから削除したり除外するのではなく、str_replace」を使って両方とも「wp_posts.post_title」に置き換えているのである。

つまり、「wp_posts.post_title OR wp_posts.post_excerpt OR wp_posts.post_content」を「wp_posts.post_title OR wp_posts.post_title OR wp_posts.post_title」と調べるように変更したのだ。

これをもうちょっと軟らかくすると、いままで「タイトル調べて~抜粋とか調べて~そいで本文調べて~結果発表~」だったのを「タイトルそしてタイトルお次もタイトルこれで結果発表!」というわけ。

正直なところ同じ場所を三度も調べるのは文字通り三度手間なのだが、今まで紹介してきたサイト内検索を強化するカスタマイズとの兼ね合いを考えると、これが一番簡単かつ無難な方法だった。

やはり、クエリの内容を増やしたり削除したり作り直したりはかなり複雑になってしまうので。

ちなみに、この置き換えるアイデアはここを参考にした。

最後に

今回使用したPHPコードが何かWebサイトに不具合を起こすことは考えにくい。なぜなら、だいぶ前から検索クエリの内容は変わっていないからだ。

ただ、打ち間違えやコピペのミスでエラーが起こる可能性もあるかもしれないので、その時は落ち着いて見直すことを心掛けてほしい。


今回は、サイト内検索のときにWordPressがデータベースから調べる範囲を記事タイトルに限定する方法を紹介した。

今回もやはり広く出回っているコードが私にとって不便極まりないもので、確かに検索範囲はタイトルに限定されるものの、以前行った空欄検索や固定記事除外のカスタマイズが無効化されてしまう厄介なものだった(検索クエリ自体を作り直す方法なので仕方がないのだが)。また、そのコードが動いているページをQuery Monitorで確認すると、一応動作はしているが内部でエラーを引き起こしていた

結局、調べに調べて辿り着いた「置き換えてしまう」方法で解決することができた。押しても引いてもダメ、つまりクエリを新しく作って上書きするのは問題が起きるクエリの一部を削除することもかなり難しい、ならば置き換えて全部同じにしてしまえばいいというやり方は頭の中でこんがらがっていたものが一気に晴れた。

結果として、満足のいくものができあがった。

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