【WordPress】特定のカテゴリを除外した記事一覧を表示する方法|tax_queryでスラッグ指定

WordPressを使ってブログを運営していると、特定のカテゴリの投稿を除外して一覧表示したい場面があります。この記事では、カテゴリーをスラッグで指定して除外する正しい方法を解説します。

この記事でわかること

  • tax_queryNOT IN でスラッグ指定のカテゴリーを除外する方法
  • 複数カテゴリーをまとめて除外する方法
  • カテゴリーIDが分かっている場合の使い分け
スポンサーリンク

WP_Queryでスラッグ指定のカテゴリーを除外する

category_nameにマイナス記号を付けても除外できない
'category_name' => '-uncategorized' のように、category_nameパラメーターにマイナス記号を付けて除外しようとする書き方を見かけますが、これは動作しません。WordPressコアの category_name 処理は、カンマ(OR)・プラス(AND)による複数スラッグの組み合わせしか解釈せず、除外の構文は存在しません。'-uncategorized'は「その名前の(存在しない)カテゴリーを検索する」条件として扱われ、投稿が常に0件になります。スラッグ指定で除外したい場合は、tax_query を直接使ってください。
functions.php/テンプレート:スラッグ指定でカテゴリーを除外
$excluded_category = 'uncategorized'; // 除外するカテゴリーのスラッグ

$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 10,
    'tax_query'      => array(
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => array( $excluded_category ),
            'operator' => 'NOT IN', // ここで除外を指定する
        ),
    ),
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        ?>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <?php
    }
    wp_reset_postdata();
} else {
    echo '投稿はありません。';
}

the_permalink() / the_title() はテンプレートタグで、内部で適切にエスケープされたうえで出力されるため、そのまま使用して問題ありません。

複数のカテゴリーをスラッグでまとめて除外する

terms の配列に複数のスラッグを渡すだけで、まとめて除外できます。

複数カテゴリーをスラッグで除外
$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 10,
    'tax_query'      => array(
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => array( 'uncategorized', 'archive' ), // 複数指定OK
            'operator' => 'NOT IN',
        ),
    ),
);

カテゴリーIDが分かっている場合の使い分け

IDが分かっているなら category__not_in が手軽
カテゴリーのIDが既に分かっている場合は、'category__not_in' => array( 1, 2, 3 ) と指定するだけで済み、tax_queryを書くよりシンプルです。また、トップページ(メインクエリ)自体から特定カテゴリーを除外したい場合は、pre_get_postsフックでメインクエリを書き換える方法もあります。記事一覧から特定のカテゴリーを除外する方法で、ID指定・pre_get_postsによる実装例を解説しています。本記事のtax_query+スラッグ指定は、「IDをいちいち調べたくない」「スラッグで管理したい」場合に向いています。

よくある質問(FAQ)

Q特定カテゴリーの記事のみ表示するWP_Queryの最もシンプルな書き方は?
Anew WP_Query(array('cat' => カテゴリーID))が最もシンプルです。スラッグで指定する場合はcategory_name='スラッグ'を使います。複数カテゴリーはcat='1,2,3'でOR指定、category__and=array(1,2,3)でAND指定します。
Qカテゴリー名からIDを取得するには?
Aget_category_by_slug('スラッグ')->term_idまたはget_term_by('slug', 'スラッグ', 'category')->term_idで取得できます。管理画面のカテゴリー一覧URLのtag_ID=XXXでも確認できます。
QIDが分かっている場合に特定カテゴリーを除外するには?
Acat='-カテゴリーID'(マイナス)で除外できます。複数除外はcat='-1,-2,-3'と指定します。category__not_inに配列でIDを渡す方法もあります。スラッグ指定で除外したい場合はtax_queryoperator => 'NOT IN'を使います。

まとめ

  • スラッグで除外tax_queryfield=>'slug'operator=>'NOT IN'を指定する
  • IDで除外category__not_inまたはcatのマイナス指定
  • 注意category_nameにマイナス記号を付けても除外にはならない

スラッグとIDどちらで管理したいかに応じて、適切な方法を選んでください。