WordPressの投稿一覧から特定のカテゴリーやタグ、タクソノミーを除いて出力する

WordPressの新着記事一覧などから、特定のカテゴリに属する記事一覧を除いて表示させたい場合があると思います。そんなときは、 pre_get_posts フックを用いて柔軟に対応することができます。

特定のカテゴリーに属する記事を除外


add_action('pre_get_posts', function($query) {
  if (is_admin() || !$query->is_main_query()) {
    return;
  }

  // トップページ
  if ($query->is_home()) {
    $query->set('category__not_in', [12, 15]);
  }
});

'category__not_in' キーワードを使えば簡単に除外することができます。第2引数には除外するカテゴリーが1つであっても、配列で指定します。

特定のタグに属する記事を除外


add_action('pre_get_posts', function($query) {
  if (is_admin() || !$query->is_main_query()) {
    return;
  }

  // トップページ
  if ($query->is_home()) {
    $query->set('tag__not_in', [18, 20]);
  }
});

タグの場合は 'tag__not_in' を使用します。

特定のタクソノミーに属する記事を除外


add_action('pre_get_posts', function($query) {
  if (is_admin() || !$query->is_main_query()) {
    return;
  }

  // トップページ
  if ($query->is_home()) {
    $query->set('tax_query', [
      [
        'taxonomy' => 'tax',
        'terms' => [12, 15],
        'operator' => 'NOT IN'
      ]
    ]);
  }
});

タクソノミーの場合は '*__not_in' のような変数が用意されていないので、タクソノミーの配列で指定します。