【WordPress】特定のカテゴリーだけ検索対象から除外する方法

【WordPress】特定のカテゴリーだけ検索対象から除外する方法 WordPress

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でもスラッグでも柔軟に対応できるため、目的に応じて使い分けましょう。