閉じる

WordPressのWP_Queryでmeta_queryのrelationを活用する方法:AND・OR条件の書き方

WordPressでカスタムフィールドを利用した高度な絞り込みを実現するには、WP_Querymeta_queryを使いこなすことが不可欠です。

特に、複数の条件を組み合わせて検索を行う場合、それらの条件をどのように関連付けるかを指定するrelationパラメータの理解が重要となります。

本記事では、実務で頻繁に利用されるANDおよびOR条件の具体的な書き方から、より複雑なネスト構造の構築方法まで詳しく解説します。

2026年現在のモダンな開発環境においても、カスタムフィールドを活用した検索機能の実装は多くのWebサイトで求められています。

最新のWordPress仕様に基づき、柔軟でメンテナンス性の高いクエリの書き方を習得しましょう。

meta_queryの基本構造

meta_queryは、投稿(post)に紐付けられたカスタムフィールドの値を基準にクエリを発行するための多次元配列です。

1つの条件を指定する場合、基本的には「キー(key)」「値(value)」「比較演算子(compare)」の3つをセットにして記述します。

単一の条件であれば単純な配列で済みますが、複数の条件を扱う際には、それらをどのように結合するかを明示しなければなりません。

そこで登場するのが、複数の条件配列をまとめるためのrelationパラメータです。

このパラメータを適切に設定することで、データの抽出精度を劇的に向上させることが可能になります。

relationパラメータによる条件の結合

relationパラメータには、主にANDまたはORのいずれかを指定します。

このパラメータは、条件を指定する配列の「直上の階層」に配置するのがルールです。

デフォルトではANDが適用されるため、明示的に記述しなくても「すべての条件を満たす投稿」が抽出されます。

しかし、コードの可読性を高め、意図しない挙動を防ぐためには、常に明示的に指定しておくことが推奨されます。

論理和であるOR条件を使用したい場合には、このパラメータの指定が必須となります。

AND条件(すべての条件に一致)

AND条件は、指定したすべてのカスタムフィールドの条件を満たす投稿を取得したい場合に使用します。

例えば、「価格が1000円以上」かつ「在庫が1個以上ある」という商品を検索する場合などが該当します。

以下に、AND条件を用いた具体的なコード例を示します。

PHP
$args = array(
    'post_type' => 'product', // 投稿タイプ
    'meta_query' => array(
        'relation' => 'AND', // すべての条件を満たす
        array(
            'key'     => 'price',
            'value'   => 1000,
            'type'    => 'NUMERIC',
            'compare' => '>='
        ),
        array(
            'key'     => 'stock_count',
            'value'   => 0,
            'type'    => 'NUMERIC',
            'compare' => '>'
        ),
    ),
);
$query = new WP_Query($args);

このクエリを実行すると、データベース上では以下のような条件で検索が行われます。

実行結果
(meta_key = 'price' AND meta_value >= 1000) 
AND 
(meta_key = 'stock_count' AND meta_value > 0)

OR条件(いずれかの条件に一致)

OR条件は、指定した複数の条件のうち、少なくとも1つに一致する投稿を取得したい場合に使用します。

例えば、「期間限定セール対象」または「おすすめ商品フラグが立っている」のいずれかを満たす投稿を表示したい場合に便利です。

以下に、OR条件を用いたコード例を示します。

PHP
$args = array(
    'post_type' => 'post',
    'meta_query' => array(
        'relation' => 'OR', // いずれかの条件を満たす
        array(
            'key'     => 'is_sale',
            'value'   => '1',
            'compare' => '='
        ),
        array(
            'key'     => 'is_recommended',
            'value'   => '1',
            'compare' => '='
        ),
    ),
);
$query = new WP_Query($args);

この記述により、どちらか一方のカスタムフィールドが条件を満たしていれば、その投稿が結果に含まれるようになります。

高度なネスト(入れ子)構造の作成

より複雑な検索要件がある場合、meta_queryの中にさらにmeta_queryを含める「ネスト構造」を利用します。

例えば、「(条件A かつ 条件B) または (条件C かつ 条件D)」という複雑な論理構造を組み立てることが可能です。

この手法は、不動産検索サイトやECサイトなど、多角的な絞り込みが必要なシステムで非常に重宝されます。

ネストを行う際は、配列の階層を正しく意識し、それぞれの階層にrelationを配置することがポイントです。

ネスト構造の具体例

ここでは、「(価格が5000円以下 かつ カテゴリが消耗品) または (限定フラグがON)」という条件を想定します。

このようなケースでは、外側のrelationORにし、その中の一つにAND条件の配列を配置します。

PHP
$args = array(
    'post_type' => 'item',
    'meta_query' => array(
        'relation' => 'OR',
        // 条件グループ1: AND条件
        array(
            'relation' => 'AND',
            array(
                'key'     => 'price',
                'value'   => 5000,
                'type'    => 'NUMERIC',
                'compare' => '<='
            ),
            array(
                'key'     => 'category_type',
                'value'   => 'consumables',
                'compare' => '='
            ),
        ),
        // 条件グループ2: 単一条件
        array(
            'key'     => 'is_limited',
            'value'   => '1',
            'compare' => '='
        ),
    ),
);
$query = new WP_Query($args);

この構造を用いることで、従来の単純な条件指定では実現できなかった柔軟なデータ取得が可能になります。

compareパラメータで利用可能な演算子

meta_queryの表現力を高めるためには、compareパラメータで使える演算子の種類を把握しておくことが重要です。

値の一致だけでなく、範囲指定や部分一致などを使い分けることで、より実用的な検索機能を実装できます。

以下に、主要な演算子とその意味をまとめました。

演算子意味使用例
=等しい特定の値と完全に一致する場合
!=等しくない特定の値を除外する場合
> / >=より大きい / 以上数値や日付の比較に使用
< / <=より小さい / 以下価格の上限設定などに使用
LIKE部分一致文字列が含まれているか検索
INいずれかを含む複数の候補値のいずれかに合致
BETWEEN範囲内数値や日付の範囲指定に使用
EXISTS存在するキーが設定されているか確認

特に数値の比較を行う場合は、typeパラメータにNUMERICDECIMALを指定することを忘れないでください。

これを怠ると、文字列として比較が行われ、意図しない検索結果になる可能性があるため注意が必要です。

パフォーマンスに関する注意点

meta_queryは非常に強力な機能ですが、乱用するとデータベースのパフォーマンスを低下させる原因になります。

WordPressのカスタムフィールド(wp_postmetaテーブル)は、その構造上、大量のデータを対象とした複雑な検索には不向きな側面があります。

特にOR条件やLIKE検索を多用すると、スキャンする行数が増え、サイトの表示速度が低下する恐れがあります。

数万件を超えるような大規模なデータを扱う場合は、カスタムタクソノミーへの移行や、専用の検索エンジン(Elasticsearchなど)の導入を検討すべきです。

小中規模のサイトであれば、オブジェクトキャッシュを活用する、あるいは「update_post_meta_cache」を適切に制御することで負荷を軽減できます。

また、不要なカスタムフィールドを整理し、検索対象となるキーにインデックスを貼るようなデータベース最適化も視野に入れると良いでしょう。

よくある間違いとデバッグ方法

meta_queryが意図通りに動かない場合、最も多い原因は「配列の階層構造のミス」です。

特にrelationを記述する位置が、一階層深すぎたり浅すぎたりしていないかを確認してください。

もう一つの落とし穴は、保存されているデータの型と、クエリで指定している型の不一致です。

真偽値(true/false)を保存しているつもりでも、データベース上では文字列の'0''1'として保存されていることが一般的です。

正しくデバッグを行うためには、発行された生のSQLを確認するのが最も確実です。

以下のコードを一時的に挿入することで、最後に実行されたSQLクエリを出力できます。

PHP
echo '<pre>';
var_dump($query->request);
echo '</pre>';

出力されたSQLを見ることで、JOINが正しく行われているか、WHERE句の論理構造が意図通りかを確認できます。

まとめ

WordPressのWP_Queryにおけるmeta_queryは、カスタムフィールドを用いた柔軟なサイト構築の要となる機能です。

relationパラメータを使いこなし、ANDOR条件を適切に組み合わせることで、複雑なユーザー要望にも応えることが可能になります。

基本となる単一条件の書き方を理解した上で、今回紹介したネスト構造や演算子の使い分けに挑戦してみてください。

ただし、利便性と引き換えにデータベースへの負荷が高まる傾向があるため、常にパフォーマンスを意識した設計を心がけましょう。

適切な設計と正確なコード記述によって、高速で使い勝手の良いWordPressサイトを実現してください。

URLをコピーしました!