本文へ移動

実装例

WP_Queryで複数条件を組み合わせる方法
|AND・ORを指定できる場所とできない組み合わせ

複数条件のWP_Queryでは、まず「すべて満たす」のか「どれかを満たす」のかを文章にします。そのうえで、同じ種類の条件どうしをrelationでつなぐ場合と、異なる種類の条件が自動的にANDになる場合を分けると迷いません。

Huddly Huddly 投稿日: 2026年9月14日 読了目安: 5分

AND・ORは、同じ種類の条件内と異なる種類の条件間を分けて考えます

tax_querymeta_queryをWP_Queryの$args直下へ並べると、両方を満たす投稿が取得されます。relationは、同じtax_querymeta_queryの中に条件が2つ以上あるとき、その内側をANDまたはORでつなぐ指定です。

「カテゴリー条件またはカスタムフィールド条件」のように、異なる種類の条件をまたぐORは通常のWP_Query引数だけでは表現できません。この記事では、複数条件を組むときのAND・ORの置き場所を順に見ていきます。

最初に、すべて満たすか、どれかを満たすかを決める

たとえば「制作情報または更新情報カテゴリーに属し、初心者向けの記事を表示する」という要件を分解します。

条件の範囲日本語の要件コード上の場所
カテゴリー内制作情報または更新情報tax_queryの1つの条件へterms 10,11とoperator INを入れる
異なる種類の条件カテゴリー条件を満たし、audienceの保存値がbeginner$args直下へtax_queryとmeta_queryを並べる
Meta Query内公開対象または会員対象meta_queryへ2つの条件を置きrelationをOR

terms => array( 10, 11 )operator => ‘IN’は、2つのタームIDのどちらかに属する投稿を表します。その結果とaudience = beginnerを両方満たす投稿だけが残ります。

表の1行目は1つのTax Queryに入れる候補値、2行目はTax QueryとMeta Queryの組み合わせ、3行目はMeta Query内に複数の条件を置く例です。先に条件の範囲を分けると、relationを書く場所を取り違えにくくなります。

WP Query BuilderでTax QueryとMeta Queryを入力する

公開中のWP Query Builderで「詳細設定(全項目)」を選びます。この記事では、入力した条件だけを追えるように自動高速化をOFFにし、独自一覧の並びを保つため「固定表示を無視」をtrueにしました。

入力欄役割
投稿タイプpost通常投稿を対象にする
公開状態publish公開済みだけにする
取得件数6最大6件を返す
並び方向 / orderDESC新しい投稿から並べる
並べ替えの基準 / orderbydate投稿日を基準にする
分類名 / taxonomycategoryカテゴリーを調べる
値の指定形式 / fieldterm_idタームIDで指定する
分類の値 / terms10,11ID10または11を候補にする
比較方法 / operatorIN候補のどれかに属する投稿を残す
キー / keyaudience対象のカスタムフィールド名
値 / valuebeginner一致させる保存値
比較方法 / compare=完全一致で比較する
固定表示を無視true固定投稿を特別扱いしない
WP Query BuilderのTax Queryへcategory、term_id、10,11、INを入力し、右側にtax_queryコードが生成された画面
公開中のWP Query BuilderTax Queryでカテゴリー候補を指定

categoryのterm_id 10または11に属する投稿を対象にする入力です。入力欄と右側のtax_queryを見比べると、各値がどこへ入ったか確認できます。

続いてMeta Queryへaudiencebeginner=を入力します。これはTax Query内の条件を増やす操作ではなく、WP_Query直下に異なる種類の条件を追加する操作です。

WP Query BuilderのMeta Queryへaudience、beginner、イコールを入力し、右側にTax QueryとMeta Queryのコードが生成された画面
公開中のWP Query Builder異なる種類の条件としてMeta Queryを追加

Tax QueryとMeta Queryは$args直下へ並びます。右側のコードで、2つの配列が同じ階層にあることを確認できます。

次は、WP Query Builderがこの画面で生成したコードです。入力値、配列の順序、書式を変更せずに掲載しています。

引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。

PHPgenerated-multiple-condition-args.phpカテゴリーとaudienceの両方を満たす公開投稿を取得する条件
$args = array(    'post_type' => 'post',    'post_status' => 'publish',    'posts_per_page' => 6,    'order' => 'DESC',    'orderby' => 'date',    'tax_query' => array(        array(            'taxonomy' => 'category',            'field' => 'term_id',            'operator' => 'IN',            'terms' => array(                10,                11            )        )    ),    'meta_query' => array(        array(            'key' => 'audience',            'compare' => '=',            'value' => 'beginner'        )    ),    'ignore_sticky_posts' => true);
WP Query Builderへ入れるタームID、メタキー、保存値は例です。そのまま本番へ貼るのではなく、対象サイトの管理画面やデータベースで実際の値を確認して置き換えてください。

生成された$argsを子テーマの表示ループへつなぐ

WP Query Builderが生成するのは取得条件の$argsです。クラシックテーマの子テーマなら、表示処理をtemplate-parts/beginner-news.phpへまとめます。下の完成例は、先ほどWP Query Builderが生成した$argsを変更せずに使っています。

PHPtemplate-parts/beginner-news.php条件を満たす記事のタイトル、カテゴリー、対象読者を一覧表示する
<?php$args = array(    'post_type' => 'post',    'post_status' => 'publish',    'posts_per_page' => 6,    'order' => 'DESC',    'orderby' => 'date',    'tax_query' => array(        array(            'taxonomy' => 'category',            'field' => 'term_id',            'operator' => 'IN',            'terms' => array(                10,                11            )        )    ),    'meta_query' => array(        array(            'key' => 'audience',            'compare' => '=',            'value' => 'beginner'        )    ),    'ignore_sticky_posts' => true); $beginner_news_query = new WP_Query( $args ); if ( $beginner_news_query->have_posts() ) :    ?>    <section aria-labelledby="beginner-news-title">        <h2 id="beginner-news-title">初心者向けの制作・更新情報</h2>        <ul>            <?php while ( $beginner_news_query->have_posts() ) : ?>                <?php $beginner_news_query->the_post(); ?>                <li>                    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>                    <span><?php the_category( ' / ' ); ?></span>                    <span><?php echo esc_html( (string) get_post_meta( get_the_ID(), 'audience', true ) ); ?></span>                </li>            <?php endwhile; ?>        </ul>    </section>    <?phpelse :    echo '<p>条件に合う記事はありません。</p>';endif; wp_reset_postdata();

このファイルを子テーマへ保存し、表示したい固定ページテンプレートのメインループ内で本文の後から1回呼びます。

引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。

PHPpage.php固定ページ本文の後に複数条件の一覧を読み込む
<?php get_template_part( 'template-parts/beginner-news' ); ?>

ブロックテーマでは、子テーマの独自テンプレートや、表示用ショートコードを持つ小さなプラグインへ処理を置き換えます。どこへ置く場合も、独自ループ後のwp_reset_postdata()を省かないでください。

テーマファイルへ加える前に、ローカルまたはステージングで対象投稿のタームとメタ値を確認します。検証環境をこれから用意する場合は、バックアップと利用できるPHPバージョンも公式情報で確かめてください。

実際の投稿で、両方を満たす2件だけになるか確認する

分離したWordPress検証環境へ、次の4投稿を用意しました。ID79はカテゴリー10、ID80はカテゴリー11、ID81は両方、ID82は別カテゴリーです。audienceはID79と81がbeginner、ID80がadvanced、ID82は未保存です。

生成された$argsをそのままWP_Queryへ渡すと、Tax QueryとMeta Queryの両方を満たすID81と79だけが投稿日降順で返りました。

WordPress検証環境でTax QueryとMeta Queryの両方を満たすID81とID79の2件が表示された画面
実際のWP_Query結果両方の条件を満たす投稿を取得

カテゴリー10または11に属し、audienceの保存値がbeginnerの投稿だけを表示しています。

同じ投稿データで、条件を1つずつ外した結果も比較しました。Tax Queryだけなら3件、Meta Queryだけなら2件、両方なら2件です。条件を足すほど、両方を満たす投稿へ候補が狭まることが分かります。

Tax QueryだけはID81、80、79の3件、Meta QueryだけはID81、79の2件、両方はID81、79の2件になった比較画面
同じデータで条件比較条件を追加したときの取得IDを確認

Tax QueryだけではID81・80・79、Meta QueryだけではID81・79、両方ではID81・79が残りました。件数と投稿IDを比べると、どの条件で候補が除かれたか分かります。

複数条件を整理して$argsを作る

Tax Query、Meta Query、Date Queryを別々に組み立てられます。生成後は各条件を1つずつ試し、最後に組み合わせて取得IDを確認してください。

AND・ORを指定できる場所とできない組み合わせを整理する

relationが必要なのは、同じtax_queryまたはmeta_queryの中へ条件を2つ以上置く場合です。省略時はANDです。

引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。

PHPtax-query-relation-or.php制作情報カテゴリーまたはfeaturedタグの投稿を取得するTax Query
$tax_query = array(    'relation' => 'OR',    array(        'taxonomy' => 'category',        'field'    => 'term_id',        'terms'    => array( 10 ),    ),    array(        'taxonomy' => 'post_tag',        'field'    => 'slug',        'terms'    => array( 'featured' ),    ),);

一方、同じタクソノミーの候補値を「どれか1つ」で選ぶだけなら、今回のように1つの条件へ複数のtermsを入れてINを使えます。条件を分ける前に、複数の候補値を1つの条件へまとめられないか確認してください。

同じtax_queryまたはmeta_queryの中では、条件を入れ子にしてANDORを組み合わせることもできます。ただし、条件の階層が増えるほど入力ミスや0件の原因を追いにくくなります。まずこの記事の範囲で単純なAND・ORを確認し、複雑な入れ子は別の実装例として扱うのが安全です。

Tax Query内で2つの条件をAND・ORにつなぐ具体例が必要なら、次の記事でrelationoperatorの違いを実データと一緒に確認できます。

Tax QueryのAND・ORを確認するtax_queryでAND・ORを指定する方法記事を読む

異なる種類の条件を$args直下へ並べるとANDになる

次のように異なる種類の条件を$args直下へ並べた場合、relationを書かなくても、原則としてすべてを満たす投稿が対象です。

引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。

PHPmultiple-query-groups.php検索語、分類、カスタムフィールド、期間をすべて満たす投稿へ絞る
$args = array(    'post_type'  => 'post',    's'          => 'WordPress',    'tax_query'  => array( /* 分類の条件 */ ),    'meta_query' => array( /* カスタムフィールドの条件 */ ),    'date_query' => array( /* 投稿日の条件 */ ),);

これは「検索語を含み、分類条件を満たし、メタ条件を満たし、期間内でもある」というANDです。最初から全部入れて0件になった場合は、どの条件が合っていないか分かりません。検索語だけ、Tax Queryだけ、Meta Queryだけの順に確認し、最後に組み合わせます。

日付条件を追加したい場合は、先に期間だけで境界日と取得IDを確認してください。afterbeforeinclusiveの使い分けは、次の期間指定の記事で実際の投稿日を使って確認できます。

期間指定を先に確認するWordPressで期間を指定して記事を絞り込む方法記事を読む

異なる種類の条件をまたぐORは通常の引数だけでは指定できない

「カテゴリー10に属する、またはaudienceがbeginner」のような、tax_querymeta_queryをまたぐORを、$args[‘relation’] = ‘OR’のようには指定できません。WP_Query直下には、異なる種類の条件を横断するrelationがないためです。

実現したい条件通常の引数での扱い対応
Tax Query内の条件AまたはB可能tax_query内のrelationをOR
Meta Query内の条件AまたはB可能meta_query内のrelationをOR
Date Query内の条件AまたはB可能date_query内のrelationをOR
Tax QueryまたはMeta Query直接は不可要件やデータ設計を見直す
検索語またはMeta Query直接は不可別クエリ統合やSQL変更の影響を設計する

無理にSQLフィルターへ進む前に、同じ意味を1つのタクソノミーやメタキーへ寄せられないか、対象投稿へ共通のタームを付けられないかを検討します。別々のクエリ結果をPHPで統合する方法は、ページネーション、重複排除、並び順、総件数の扱いが変わるため、単純な置き換えではありません。

指定できない、または意図が崩れやすい組み合わせを避ける

WordPress公式リファレンスでは、post__inpost__not_inを同じクエリで組み合わせられないことが明記されています。含めるIDと除外するIDが必要なら、PHP側で除外後に残ったIDの一覧を作り、post__inへ渡します。

組み合わせ問題安全な整理
post__in + post__not_in同じクエリで組み合わせられない除外後のIDだけをpost__inへ渡す
tax_query + meta_queryをORにしたい直下に横断relationがない共通タームやデータ設計を検討する
offset + paged2ページ目以降の位置がずれやすいページング式を設計して検証する
orderby=meta_value_numだけ並べ替えるメタキーが不明meta_keyも指定する
複数条件を一度に追加0件の原因を特定しにくい各条件を単独で確認してから足す

Meta Queryそのもののcomparetypeで迷う場合は、複数条件のまま推測せず、1つの条件へ戻してください。次の記事では、保存値の確認から=IN、数値比較までを順番に試せます。

Meta Queryを単独で確認するmeta_queryでカスタムフィールドを絞り込む方法記事を読む

実装後は各条件と組み合わせ後の取得結果を確認する

最後は、各条件を単独で通した記録と、すべてを組み合わせた記録を残します。次の順番なら、0件になった箇所を追いやすくなります。

複数条件を安全に確認する順番

  1. 1
    日本語で、すべて満たす条件とどれかを満たす条件を書く
  2. 2
    Tax Queryだけで期待する投稿IDが返るか確認する
  3. 3
    Meta Queryだけで期待する投稿IDが返るか確認する
  4. 4
    必要ならDate Queryや検索語も単独で確認する
  5. 5
    異なる種類の条件を1つずつ$args直下へ戻し、件数とIDの変化を記録する
  6. 6
    0件、1件、上限より多い件数でも表示を確認する
  7. 7
    独自ループ後に元ページのタイトルや本文が変わっていないか確認する

件数だけでは、偶然同じ数の別投稿が返っていても気づけません。開発中は投稿ID、ターム、メタ値を一緒に出し、期待する投稿と比較します。本番表示では必要な情報だけへ戻してください。

複数条件の最終チェック

  • 要件をANDとORの文章へ分けた
  • relationを使う条件と位置を確認した
  • Tax Query各条件のtaxonomy・field・terms・operatorを確認した
  • Meta Query各条件のkey・value・compare・typeを確認した
  • 異なる種類の条件をまたぐORを通常の引数で表そうとしていない
  • post__inとpost__not_inを同時に使っていない
  • 各条件を単独で確認してから組み合わせた
  • 件数だけでなく取得IDを確認した
  • 表示ファイルと呼び出し位置を記録した
  • wp_reset_postdataを独自ループ後に実行した

まとめ:relationの前に、条件の範囲を決める

複数条件のWP_Queryでは、まず要件を日本語で整理します。同じtax_query内、同じmeta_query内など、同じ種類の条件をつなぐときにrelationを使います。異なる種類の条件を$args直下へ並べた場合はANDです。

異なる種類の条件をまたぐORや、post__inpost__not_inの同時指定は、そのまま書き足しても解決しません。データ設計やID集合を先に整理し、各条件を単独で確認してから組み合わせましょう。

複数条件を画面で整理してコードにする

Tax Query、Meta Query、Date Queryの入力場所を分けて確認できます。WP Query Builderが生成したコードはローカルまたはステージングへ置き、期待する投稿IDまで確認してから利用してください。

複数条件の構造を公式資料で確認する

relationの位置や使える比較方法は、条件の種類ごとの公式資料で確認できます。条件が増えたときは、WP_Query全体と各query classの両方へ戻ると構造を見失いません。

複数条件のよくある質問

relationの位置と、通常の引数で表せる範囲について、実装時に迷いやすい点を短く整理します。

WP Query BuilderBuilderで条件を組み直す条件を選び、WP_Queryのコードを画面で作れます。Builderでクエリを作る

この記事を書いた人

Huddly

Web制作 / フロントエンドエンジニア

WordPressとフロントエンド実装で迷いやすい点を、公式情報と検証結果を分けながら、初学者にも追いやすい順序で整理しています。

この記事の検証情報

検証環境

WordPress
7.1
PHP
8.3.33
テーマ
wpq-media + DDEV
対象
カスタム投稿 / taxonomy / meta_query

更新履歴

  • 2026年9月14日 初回公開

この記事を活用する

あとで見返す・共有する

お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。

任意のご支援 役に立ったときだけ、活動を応援できます OFUSEはサイト・記事制作に使います。支援の有無で、読める内容や使える機能は変わりません。