AND・ORは、同じ種類の条件内と異なる種類の条件間を分けて考えます
tax_queryとmeta_queryをWP_Queryの$args直下へ並べると、両方を満たす投稿が取得されます。relationは、同じtax_queryやmeta_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件を返す |
| 並び方向 / order | DESC | 新しい投稿から並べる |
| 並べ替えの基準 / orderby | date | 投稿日を基準にする |
| 分類名 / taxonomy | category | カテゴリーを調べる |
| 値の指定形式 / field | term_id | タームIDで指定する |
| 分類の値 / terms | 10,11 | ID10または11を候補にする |
| 比較方法 / operator | IN | 候補のどれかに属する投稿を残す |
| キー / key | audience | 対象のカスタムフィールド名 |
| 値 / value | beginner | 一致させる保存値 |
| 比較方法 / compare | = | 完全一致で比較する |
| 固定表示を無視 | true | 固定投稿を特別扱いしない |

categoryのterm_id 10または11に属する投稿を対象にする入力です。入力欄と右側のtax_queryを見比べると、各値がどこへ入ったか確認できます。
続いてMeta Queryへaudience、beginner、=を入力します。これはTax Query内の条件を増やす操作ではなく、WP_Query直下に異なる種類の条件を追加する操作です。

Tax QueryとMeta Queryは$args直下へ並びます。右側のコードで、2つの配列が同じ階層にあることを確認できます。
次は、WP Query Builderがこの画面で生成したコードです。入力値、配列の順序、書式を変更せずに掲載しています。
引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。
$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);生成された$argsを子テーマの表示ループへつなぐ
WP Query Builderが生成するのは取得条件の$argsです。クラシックテーマの子テーマなら、表示処理をtemplate-parts/beginner-news.phpへまとめます。下の完成例は、先ほどWP Query Builderが生成した$argsを変更せずに使っています。
<?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とループへ組み込んでください。
<?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だけが投稿日降順で返りました。

カテゴリー10または11に属し、audienceの保存値がbeginnerの投稿だけを表示しています。
同じ投稿データで、条件を1つずつ外した結果も比較しました。Tax Queryだけなら3件、Meta Queryだけなら2件、両方なら2件です。条件を足すほど、両方を満たす投稿へ候補が狭まることが分かります。

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とループへ組み込んでください。
$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の中では、条件を入れ子にしてANDとORを組み合わせることもできます。ただし、条件の階層が増えるほど入力ミスや0件の原因を追いにくくなります。まずこの記事の範囲で単純なAND・ORを確認し、複雑な入れ子は別の実装例として扱うのが安全です。
Tax Query内で2つの条件をAND・ORにつなぐ具体例が必要なら、次の記事でrelationとoperatorの違いを実データと一緒に確認できます。
Tax QueryのAND・ORを確認するtax_queryでAND・ORを指定する方法同じTax Queryの内側をつなぐrelationと、1つの条件内で使うoperatorを混同しないための実装ガイドです。
記事を読む異なる種類の条件を$args直下へ並べるとANDになる
次のように異なる種類の条件を$args直下へ並べた場合、relationを書かなくても、原則としてすべてを満たす投稿が対象です。
引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。
$args = array( 'post_type' => 'post', 's' => 'WordPress', 'tax_query' => array( /* 分類の条件 */ ), 'meta_query' => array( /* カスタムフィールドの条件 */ ), 'date_query' => array( /* 投稿日の条件 */ ),);これは「検索語を含み、分類条件を満たし、メタ条件を満たし、期間内でもある」というANDです。最初から全部入れて0件になった場合は、どの条件が合っていないか分かりません。検索語だけ、Tax Queryだけ、Meta Queryだけの順に確認し、最後に組み合わせます。
日付条件を追加したい場合は、先に期間だけで境界日と取得IDを確認してください。after・before・inclusiveの使い分けは、次の期間指定の記事で実際の投稿日を使って確認できます。
期間指定を先に確認するWordPressで期間を指定して記事を絞り込む方法日付条件を単独で確認してから複数条件へ戻すための手順です。
記事を読む異なる種類の条件をまたぐORは通常の引数だけでは指定できない
「カテゴリー10に属する、またはaudienceがbeginner」のような、tax_queryとmeta_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__inとpost__not_inを同じクエリで組み合わせられないことが明記されています。含めるIDと除外するIDが必要なら、PHP側で除外後に残ったIDの一覧を作り、post__inへ渡します。
| 組み合わせ | 問題 | 安全な整理 |
|---|---|---|
| post__in + post__not_in | 同じクエリで組み合わせられない | 除外後のIDだけをpost__inへ渡す |
| tax_query + meta_queryをORにしたい | 直下に横断relationがない | 共通タームやデータ設計を検討する |
| offset + paged | 2ページ目以降の位置がずれやすい | ページング式を設計して検証する |
| orderby=meta_value_numだけ | 並べ替えるメタキーが不明 | meta_keyも指定する |
| 複数条件を一度に追加 | 0件の原因を特定しにくい | 各条件を単独で確認してから足す |
Meta Queryそのもののcompareやtypeで迷う場合は、複数条件のまま推測せず、1つの条件へ戻してください。次の記事では、保存値の確認から=、IN、数値比較までを順番に試せます。
Meta Queryを単独で確認するmeta_queryでカスタムフィールドを絞り込む方法key・value・compare・typeのどこで0件になったかを切り分けるためのガイドです。
記事を読む実装後は各条件と組み合わせ後の取得結果を確認する
最後は、各条件を単独で通した記録と、すべてを組み合わせた記録を残します。次の順番なら、0件になった箇所を追いやすくなります。
複数条件を安全に確認する順番
- 1日本語で、すべて満たす条件とどれかを満たす条件を書く
- 2Tax Queryだけで期待する投稿IDが返るか確認する
- 3Meta Queryだけで期待する投稿IDが返るか確認する
- 4必要ならDate Queryや検索語も単独で確認する
- 5異なる種類の条件を1つずつ$args直下へ戻し、件数とIDの変化を記録する
- 60件、1件、上限より多い件数でも表示を確認する
- 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__inとpost__not_inの同時指定は、そのまま書き足しても解決しません。データ設計やID集合を先に整理し、各条件を単独で確認してから組み合わせましょう。
複数条件を画面で整理してコードにする
Tax Query、Meta Query、Date Queryの入力場所を分けて確認できます。WP Query Builderが生成したコードはローカルまたはステージングへ置き、期待する投稿IDまで確認してから利用してください。
複数条件の構造を公式資料で確認する
relationの位置や使える比較方法は、条件の種類ごとの公式資料で確認できます。条件が増えたときは、WP_Query全体と各query classの両方へ戻ると構造を見失いません。
複数条件のよくある質問
relationの位置と、通常の引数で表せる範囲について、実装時に迷いやすい点を短く整理します。
この記事の検証情報
検証環境
- WordPress
- 7.1
- PHP
- 8.3.33
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年9月14日 初回公開
この記事を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。


