WordPressを使ってブログを運営していると、特定のカテゴリの投稿を除外して一覧表示したい場面があります。この記事では、カテゴリーをスラッグで指定して除外する正しい方法を解説します。
この記事でわかること
tax_queryのNOT 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が既に分かっている場合は、
カテゴリーのIDが既に分かっている場合は、
'category__not_in' => array( 1, 2, 3 ) と指定するだけで済み、tax_queryを書くよりシンプルです。また、トップページ(メインクエリ)自体から特定カテゴリーを除外したい場合は、pre_get_postsフックでメインクエリを書き換える方法もあります。記事一覧から特定のカテゴリーを除外する方法で、ID指定・pre_get_postsによる実装例を解説しています。本記事のtax_query+スラッグ指定は、「IDをいちいち調べたくない」「スラッグで管理したい」場合に向いています。よくある質問(FAQ)
Q特定カテゴリーの記事のみ表示するWP_Queryの最もシンプルな書き方は?
A
new WP_Query(array('cat' => カテゴリーID))が最もシンプルです。スラッグで指定する場合はcategory_name='スラッグ'を使います。複数カテゴリーはcat='1,2,3'でOR指定、category__and=array(1,2,3)でAND指定します。Qカテゴリー名からIDを取得するには?
A
get_category_by_slug('スラッグ')->term_idまたはget_term_by('slug', 'スラッグ', 'category')->term_idで取得できます。管理画面のカテゴリー一覧URLのtag_ID=XXXでも確認できます。QIDが分かっている場合に特定カテゴリーを除外するには?
A
cat='-カテゴリーID'(マイナス)で除外できます。複数除外はcat='-1,-2,-3'と指定します。category__not_inに配列でIDを渡す方法もあります。スラッグ指定で除外したい場合はtax_queryのoperator => 'NOT IN'を使います。まとめ
- スラッグで除外:
tax_queryでfield=>'slug'・operator=>'NOT IN'を指定する - IDで除外:
category__not_inまたはcatのマイナス指定 - 注意:
category_nameにマイナス記号を付けても除外にはならない
スラッグとIDどちらで管理したいかに応じて、適切な方法を選んでください。

