閉じる

WordPressのWP_Queryでカテゴリーを絞り込む方法:基本から応用的なクエリ設定まで

WordPressでサイトを構築する際、特定のカテゴリーに属する記事だけを表示したい場面は非常に多くあります。

標準的なメインクエリだけでなく、独自の条件で投稿データを取得できるクラスであるWP_Queryを使いこなすことは、開発者にとって必須のスキルと言えるでしょう。

カテゴリー絞り込みには複数のパラメータが存在し、単純なID指定から複雑な複数条件の組み合わせまで、用途に合わせて最適な手法を選択する必要があります。

本記事では、WordPressのWP_Queryを使用してカテゴリーを絞り込むための基本的な手法から、tax_queryを用いた応用的な実装方法まで詳しく解説します。

WP_Queryでカテゴリーを絞り込む基本パラメータ

カテゴリーの絞り込みにおいて、最もシンプルで手軽に利用できるのが基本の引数(パラメータ)を使用する方法です。

主にカテゴリーID(cat)やカテゴリースラッグ(category_name)を利用して指定を行います。

まずは、それぞれのパラメータの特徴と使用方法を確認していきましょう。

カテゴリーIDで指定する(cat)

もっとも基本的な指定方法は、カテゴリーのIDを使用するcatパラメータです。

特定のカテゴリーIDを指定することで、そのカテゴリーに属する投稿を取得できます。

PHP
$args = array(
    // カテゴリーIDが5の記事を取得する
    'cat' => 5,
    'posts_per_page' => 10,
);
$the_query = new WP_Query($args);

複数のカテゴリーを指定したい場合は、IDをカンマ区切りで記述します。

PHP
$args = array(
    // カテゴリーIDが5、もしくは10の記事を取得する
    'cat' => '5,10',
);

また、IDの前に「-(マイナス)」を付けることで、特定のカテゴリーを除外することも可能です。

PHP
$args = array(
    // カテゴリーIDが5の記事を除外する
    'cat' => -5,
);

カテゴリースラッグで指定する(category_name)

IDではなく、管理画面で設定した「スラッグ」を使用して絞り込む場合は、category_nameを使用します。

スラッグを使用することで、コードを読んだ際にどのカテゴリーを指しているのかが判別しやすくなるメリットがあります。

PHP
$args = array(
    // スラッグが 'news' の記事を取得する
    'category_name' => 'news',
);

カンマ区切りで複数のスラッグを指定した場合は、「いずれかのカテゴリーに含まれる投稿(OR条件)」となります。

PHP
$args = array(
    // 'news' または 'event' のいずれかに属する記事を取得する
    'category_name' => 'news,event',
);

なお、category_nameという名前ですが、実際にはスラッグを指定する点に注意してください。

複数のカテゴリーを組み合わせる(category__and / category__in)

より詳細なID指定を行うためのパラメータとして、category__andcategory__inが用意されています。

これらは配列形式でIDを受け取ります。

PHP
$args = array(
    // カテゴリーIDが2と6の両方に属する記事のみを取得する(AND条件)
    'category__and' => array(2, 6),
);
PHP
$args = array(
    // カテゴリーIDが2または6のいずれかに属する記事を取得する(OR条件)
    'category__in' => array(2, 6),
);

より高度な絞り込みを行うtax_queryの使い方

前述の基本パラメータは非常に便利ですが、カスタムタクソノミーを扱う場合や、さらに複雑な条件(入れ子構造など)を指定する場合には限界があります。

そこで推奨されるのが、tax_queryというパラメータです。

tax_queryを使用すると、カテゴリー(category)だけでなくタグ(post_tag)やカスタムタクソノミーを横断した高度な検索が可能になります。

tax_queryの基本構造

tax_queryは多次元配列で指定します。

一つの条件は一つの配列として記述し、それをさらに配列で包む構造になります。

PHP
$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」ですが、明示的に指定することで意図した挙動を実現できます。

PHP
$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」に設定します。

PHP
$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
<?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におけるカテゴリー絞り込みは、サイト制作の自由度を大きく向上させます。

シンプルな条件であればcatcategory_nameを使い、複雑な条件やカスタムタクソノミーが絡む場合はtax_queryを活用するという使い分けが重要です。

特にtax_queryは、論理演算(AND/OR)や子カテゴリーの除外など、きめ細やかな制御が可能です。

それぞれのパラメータの特性を正しく理解し、サイトの要件に合わせた最適なクエリを作成しましょう。

最後に、サブループを使用した後は必ずwp_reset_postdata()を実行することを忘れないでください。

URLをコピーしました!