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

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

WordPressの標準検索では、すべての投稿が対象になりますが、場合によっては「特定のカテゴリーの記事は検索結果に含めたくない」というケースがあります。本記事では、検索結果から特定のカテゴリを除外する方法を紹介します。

スポンサーリンク

対象カテゴリーを除外する基本コード

pre_get_postsフックを使うことで、検索クエリに対して条件を加えることができます。以下は、特定のカテゴリー(例:カテゴリIDが5)を検索対象から除外するサンプルコードです。

functions.php:カテゴリID5を検索から除外
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に変換してから除外できます。

functions.php:スラッグから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’)の場合も、条件に合わせて追加する必要があります。
  • 他の条件(カスタムフィールド、タクソノミーなど)と併用する場合は、既存クエリとの競合に注意してください。

関連記事

よくある質問(FAQ)

Q特定のカテゴリーをWordPress検索から除外するコードは?
Apre_get_postsフックでis_search()・is_main_query()を確認し、$query->set(‘category__not_in’, array(カテゴリーID))で除外します。複数カテゴリーは配列で指定できます。
Q除外するカテゴリーIDを管理画面の設定から変更できるようにするには?
Aadd_options_page()で設定画面を作成し、チェックボックス等でカテゴリーを選択・保存できるUIを用意します。pre_get_postsでget_option()から除外カテゴリーを取得して適用します。
Qカテゴリー除外をRSSフィードにも適用するには?
Apre_get_postsのis_feed()も確認して同様の除外処理を適用します。またはrss_enclosure・the_content_feedフィルターで対応する方法もあります。

まとめ

検索結果から特定のカテゴリを除外するには、pre_get_postsで検索クエリを調整するのが最も確実な方法です。IDでもスラッグでも柔軟に対応できるため、目的に応じて使い分けましょう。