WordPressの標準検索では、すべての投稿が対象になりますが、場合によっては「特定のカテゴリーの記事は検索結果に含めたくない」というケースがあります。本記事では、検索結果から特定のカテゴリを除外する方法を紹介します。
対象カテゴリーを除外する基本コード
pre_get_postsフックを使うことで、検索クエリに対して条件を加えることができます。以下は、特定のカテゴリー(例:カテゴリIDが5)を検索対象から除外するサンプルコードです。
function exclude_category_from_search($query) {
if ($query->is_search() && $query->is_main_query() && !is_admin()) {
$query->set('cat', '-5'); // マイナスIDで除外
}
}
add_action('pre_get_posts', 'exclude_category_from_search');
is_search()
検索結果ページであることを確認。
is_main_query()
メインクエリにのみ適用。
!is_admin()
管理画面には影響しないように。
‘cat’ => ‘-5’
カテゴリIDが5の投稿を除外。
複数のカテゴリーを除外したい場合
複数のカテゴリを除外する場合は、マイナスIDをカンマ区切りで指定します。
$query->set('cat', '-5,-12,-23'); // ID: 5, 12, 23 を除外
スラッグで除外したい場合(カスタム対応)
カテゴリIDではなくスラッグで管理している場合は、get_term_by()関数でIDに変換してから除外できます。
function exclude_category_by_slug($query) {
if ($query->is_search() && $query->is_main_query() && !is_admin()) {
$exclude_slugs = array('news', 'private'); // 除外したいスラッグ
$exclude_ids = array();
foreach ($exclude_slugs as $slug) {
$term = get_term_by('slug', $slug, 'category');
if ($term) {
$exclude_ids[] = '-' . $term->term_id;
}
}
$query->set('cat', implode(',', $exclude_ids));
}
}
add_action('pre_get_posts', 'exclude_category_by_slug');
注意点
- 投稿タイプがカスタム(例:post_type = ‘custom_post’)の場合も、条件に合わせて追加する必要があります。
- 他の条件(カスタムフィールド、タクソノミーなど)と併用する場合は、既存クエリとの競合に注意してください。
まとめ
検索結果から特定のカテゴリを除外するには、pre_get_postsで検索クエリを調整するのが最も確実な方法です。IDでもスラッグでも柔軟に対応できるため、目的に応じて使い分けましょう。