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

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

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

今回の記事では、WordPressにデフォルトで用意されているサイト内検索対象から固定ページを除外し、

投稿機能で作成されたコンテンツのみを検索対象にする方法について解説します。

要件

WordPressのデフォルトの検索機能は「投稿」と「固定ページ」を検索対象としています。

そのため記事検索しているのに「会社概要」などの固定ページが検索結果に表示されることがあります。

検索対象を「投稿」のみに限定するカスタマイズになります。

実装

function custom_search_by_posts($query)
{
    if( $query->is_search() && $query->is_main_query() && !$query->is_admin()) {
        $query->set('post_type', 'post');
    };
}
add_filter('pre_get_posts', 'custom_search_by_posts');

解説

アクションフック(pre_get_posts)を使用することで、関数内の処理がクエリ実行前に呼び出されます。

アクションフック(pre_get_posts)

$query->is_search() : 検索ページが表示されているかを判定
$query->is_main_query() : 現在のクエリーがメインクエリーであるかどうかを判定する
!$query->is_admin() : 管理画面のクエリに影響を与えないために、指定します。

SQLのクエリを確認すると下記のようになっています。

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1
AND (((wp_posts.post_title LIKE '%検索%')
OR (wp_posts.post_excerpt LIKE '%検索%')
OR (wp_posts.post_content LIKE '%検索%')))
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'acf-disabled'
OR wp_posts.post_status = 'private')
ORDER BY wp_posts.post_title LIKE '%検索%' DESC, wp_posts.post_date DESC
LIMIT 0, 10

デフォルトの検索機能では固定ページも検索対象ですが、上記の処理を追加することで検索対象を投稿機能に限定できていることがわかります。

AND wp_posts.post_type = 'post'
カテゴリー: WordPress