前回の記事でWordPressのサイト内検索の仕組みについて解説しました。

こちらがまだの方は、まず下記の記事で構造的な理解を深めてください。

【WordPress】サイト内検索の仕組みについて解説

今回の記事ではサイト内検索の検索対象をタイトルに限定する方法について解説します。

要件

WordPressのデフォルトの検索機能では、コンテンツの本文も検索対象として含まれています。

そのため、ユーザーの入力キーワードに対して意図しない検索結果が表示されることがあります。

検索した結果、大量に検索結果が表示されて、目的の記事に辿り着けない現象を防止する目的で実装します。

実装

<?php
function custom_search_by_post_title($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', 'custom_search_by_post_title', 10, 2);
?>

解説

アクションフック(posts_where)を使用することで、クエリのWHERE句をカスタマイズすることができます。

パラメータに、$whereと$queryを指定します。

アクションフック(posts_where)

str_replace(array('excerpt', 'content'), array('title', 'title'), $where)

上記の処理のstr_replaceを使用して、デフォルトのexcerptとcontentをtitleに上書きしています。

その結果、検索対象がタイトルのみに置き換わります。

実行されるクエリは下記のようになります。検索対象が全てタイトルに置き換わっているのがわかります。

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1
AND (((wp_posts.post_title LIKE '%回転%')
OR (wp_posts.post_title LIKE '%回転%')
OR (wp_posts.post_title LIKE '%回転%')))
AND wp_posts.post_type IN ('post', 'page', 'attachment')
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'acf-disabled'
OR wp_posts.post_author = 1
AND wp_posts.post_status = 'private')
ORDER BY wp_posts.post_title LIKE '%回転%' DESC, wp_posts.post_date DESC
LIMIT 0, 10

実装参考

カテゴリー: WordPress