WordPressでサイトを構築する際、特定のカテゴリーに属する記事だけを表示したい場面は非常に多くあります。
標準的なメインクエリだけでなく、独自の条件で投稿データを取得できるクラスであるWP_Queryを使いこなすことは、開発者にとって必須のスキルと言えるでしょう。
カテゴリー絞り込みには複数のパラメータが存在し、単純なID指定から複雑な複数条件の組み合わせまで、用途に合わせて最適な手法を選択する必要があります。
本記事では、WordPressのWP_Queryを使用してカテゴリーを絞り込むための基本的な手法から、tax_queryを用いた応用的な実装方法まで詳しく解説します。
WP_Queryでカテゴリーを絞り込む基本パラメータ
カテゴリーの絞り込みにおいて、最もシンプルで手軽に利用できるのが基本の引数(パラメータ)を使用する方法です。
主にカテゴリーID(cat)やカテゴリースラッグ(category_name)を利用して指定を行います。
まずは、それぞれのパラメータの特徴と使用方法を確認していきましょう。
カテゴリーIDで指定する(cat)
もっとも基本的な指定方法は、カテゴリーのIDを使用するcatパラメータです。
特定のカテゴリーIDを指定することで、そのカテゴリーに属する投稿を取得できます。
$args = array(
// カテゴリーIDが5の記事を取得する
'cat' => 5,
'posts_per_page' => 10,
);
$the_query = new WP_Query($args);
複数のカテゴリーを指定したい場合は、IDをカンマ区切りで記述します。
$args = array(
// カテゴリーIDが5、もしくは10の記事を取得する
'cat' => '5,10',
);
また、IDの前に「-(マイナス)」を付けることで、特定のカテゴリーを除外することも可能です。
$args = array(
// カテゴリーIDが5の記事を除外する
'cat' => -5,
);
カテゴリースラッグで指定する(category_name)
IDではなく、管理画面で設定した「スラッグ」を使用して絞り込む場合は、category_nameを使用します。
スラッグを使用することで、コードを読んだ際にどのカテゴリーを指しているのかが判別しやすくなるメリットがあります。
$args = array(
// スラッグが 'news' の記事を取得する
'category_name' => 'news',
);
カンマ区切りで複数のスラッグを指定した場合は、「いずれかのカテゴリーに含まれる投稿(OR条件)」となります。
$args = array(
// 'news' または 'event' のいずれかに属する記事を取得する
'category_name' => 'news,event',
);
なお、category_nameという名前ですが、実際にはスラッグを指定する点に注意してください。
複数のカテゴリーを組み合わせる(category__and / category__in)
より詳細なID指定を行うためのパラメータとして、category__andやcategory__inが用意されています。
これらは配列形式でIDを受け取ります。
$args = array(
// カテゴリーIDが2と6の両方に属する記事のみを取得する(AND条件)
'category__and' => array(2, 6),
);
$args = array(
// カテゴリーIDが2または6のいずれかに属する記事を取得する(OR条件)
'category__in' => array(2, 6),
);
より高度な絞り込みを行うtax_queryの使い方
前述の基本パラメータは非常に便利ですが、カスタムタクソノミーを扱う場合や、さらに複雑な条件(入れ子構造など)を指定する場合には限界があります。
そこで推奨されるのが、tax_queryというパラメータです。
tax_queryを使用すると、カテゴリー(category)だけでなくタグ(post_tag)やカスタムタクソノミーを横断した高度な検索が可能になります。
tax_queryの基本構造
tax_queryは多次元配列で指定します。
一つの条件は一つの配列として記述し、それをさらに配列で包む構造になります。
$args = array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'category', // タクソノミー名を指定
'field' => 'slug', // どの値で検索するか(id, slug, name)
'terms' => 'business', // 検索する値
'operator' => 'IN', // 演算子(IN, NOT IN, AND, EXISTS, NOT EXISTS)
),
),
);
複数カテゴリーの「かつ(AND)」と「または(OR)」
複数のカテゴリー条件を組み合わせる際は、relationキーを使用します。
デフォルトは「AND」ですが、明示的に指定することで意図した挙動を実現できます。
$args = array(
'tax_query' => array(
'relation' => 'AND', // すべての条件を満たす
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array('news'),
),
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array('pickup'),
),
),
);
このクエリでは、「お知らせ(news)」であり、かつ「注目(pickup)」カテゴリーにも入っている記事のみが抽出されます。
子カテゴリーを含めるかどうかの制御
tax_queryの便利な機能の一つに、include_childrenという設定があります。
デフォルトでは「true」になっており、親カテゴリーを指定するとその子カテゴリーに属する投稿も取得されます。
もし、「親カテゴリー自体に設定された投稿のみ」を取得し、子カテゴリーの投稿を除外したい場合は、ここを「false」に設定します。
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'parent-cat',
'include_children' => false, // 子カテゴリーを含めない
),
),
);
カテゴリー絞り込みパラメータ一覧表
各パラメータの役割を整理するために、以下の表にまとめました。
実装する機能に合わせて、適切なものを選択してください。
| パラメータ名 | 指定形式 | 説明 |
|---|---|---|
cat | 整数 (ID) | カテゴリーIDを指定。マイナスで除外。 |
category_name | 文字列 (Slug) | カテゴリースラッグを指定。 |
category__and | 配列 (IDs) | 指定した全てのIDに含まれる投稿を取得。 |
category__in | 配列 (IDs) | 指定したいずれかのIDに含まれる投稿を取得。 |
category__not_in | 配列 (IDs) | 指定したIDを除外して取得。 |
tax_query | 多次元配列 | タクソノミー全般、演算子、子カテゴリー除外など高度な設定が可能。 |
実際のテンプレートでの実装例(サブループ)
カテゴリー絞り込みを用いた、実際のサブループの記述方法を見ていきましょう。
取得した投稿を一覧表示する際は、have_posts()メソッドを使用してループを回します。
<?php
$args = array(
'post_type' => 'post',
'category_name' => 'tech',
'posts_per_page' => 5,
);
$the_query = new WP_Query($args);
if ($the_query->have_posts()) :
echo '<ul>';
while ($the_query->have_posts()) : $the_query->the_post();
?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
(<?php the_time('Y.m.d'); ?>)
</li>
<?php
endwhile;
echo '</ul>';
else :
echo '<p>該当する記事が見つかりませんでした。</p>';
endif;
// メインクエリへの影響を防ぐため、必ずリセットする
wp_reset_postdata();
?>
上記のコードを実行すると、カテゴリー「tech」の記事が最新順に最大5件表示されます。
<ul>
<li><a href="...">PHPの最新機能について</a> (2026.02.10)</li>
<li><a href="...">WP_Queryの最適化手法</a> (2026.02.05)</li>
<li><a href="...">フロントエンド開発のトレンド</a> (2026.01.28)</li>
...
</ul>
ループが終わった後にwp_reset_postdata()を呼び出すことは、WordPress開発における鉄則です。
これを忘れると、その後のメインクエリやサイドバーの表示が正しく動作しなくなるトラブルの原因となります。
パフォーマンスを意識したクエリ設計
WP_Queryは非常に強力ですが、複雑な条件を多用するとデータベースへの負荷が高まる可能性があります。
特にtax_queryで複数のタクソノミーを跨いで検索する場合や、大規模なサイトでは注意が必要です。
パフォーマンスを維持するためのポイントをいくつか紹介します。
まず、可能な限りIDを使用して指定を行うことが挙げられます。
スラッグによる指定は内部的にIDへの変換処理が走るため、数値での指定の方がわずかに効率的です。
次に、posts_per_pageを適切に設定し、一度に取得するデータ量を制限してください。
また、投稿の本文が不要でタイトルやURLのみを使用する場合は、'no_found_rows' => trueを引数に追加することで、ページネーション用の計算をスキップし、クエリを高速化できます。
まとめ
WordPressのWP_Queryにおけるカテゴリー絞り込みは、サイト制作の自由度を大きく向上させます。
シンプルな条件であればcatやcategory_nameを使い、複雑な条件やカスタムタクソノミーが絡む場合はtax_queryを活用するという使い分けが重要です。
特にtax_queryは、論理演算(AND/OR)や子カテゴリーの除外など、きめ細やかな制御が可能です。
それぞれのパラメータの特性を正しく理解し、サイトの要件に合わせた最適なクエリを作成しましょう。
最後に、サブループを使用した後は必ずwp_reset_postdata()を実行することを忘れないでください。
