【WordPress】WP_Queryで複雑な条件検索を実装する方法|AND・OR・NOTの組み合わせ方

【WordPress】WP_Queryで複雑な条件検索を実装する方法|AND・OR・NOTの組み合わせ方 WordPress

WordPressでカスタム検索機能を構築する際、WP_Queryを使って複数の条件を組み合わせる必要があります。基本的な検索であればcategory_namemeta_keyで対応できますが、実務では「特定のカスタムフィールドが◯で、カテゴリが◯または◯ではない」といった複雑な要件が求められることもあります。

この記事では、AND・OR・NOTを駆使した高度な条件検索の構文と実装例を紹介します。

meta_queryでAND・OR・NOTを使いこなす

meta_queryはカスタムフィールドの検索条件を指定するための配列で、relationキーを使ってANDやOR、NOT条件を組み立てることができます。

AND条件の基本構文

$args = array(
  'post_type' => 'post',
  'meta_query' => array(
    'relation' => 'AND',
    array(
      'key' => 'price',
      'value' => 1000,
      'compare' => '>=',
      'type' => 'NUMERIC'
    ),
    array(
      'key' => 'stock',
      'value' => 10,
      'compare' => '>',
      'type' => 'NUMERIC'
    ),
  ),
);
$query = new WP_Query($args);

この例では「priceが1000以上」「stockが10より多い」投稿を取得します。

OR条件を組み合わせる

$args = array(
  'post_type' => 'post',
  'meta_query' => array(
    'relation' => 'OR',
    array(
      'key' => 'status',
      'value' => '公開中',
      'compare' => '='
    ),
    array(
      'key' => 'priority',
      'value' => '高',
      'compare' => '='
    ),
  ),
);
$query = new WP_Query($args);

この例では「statusが公開中」または「priorityが高」のいずれかを満たす投稿が対象となります。

NOT条件の使い方

compare => '!='NOT EXISTSを使えば否定条件を指定できます。

$args = array(
  'post_type' => 'post',
  'meta_query' => array(
    array(
      'key' => 'archive_flag',
      'value' => '1',
      'compare' => '!='
    ),
    array(
      'key' => 'hidden_flag',
      'compare' => 'NOT EXISTS'
    ),
  ),
);
$query = new WP_Query($args);

「archive_flagが1以外」「hidden_flagが存在しない」投稿だけを抽出できます。

tax_queryでカテゴリやタグも複雑に制御する

tax_queryを使えば、カテゴリ・タグ・カスタムタクソノミーを含めた条件も構築可能です。

$args = array(
  'post_type' => 'post',
  'tax_query' => array(
    'relation' => 'AND',
    array(
      'taxonomy' => 'category',
      'field'    => 'slug',
      'terms'    => array('news', 'event'),
      'operator' => 'IN',
    ),
    array(
      'taxonomy' => 'post_tag',
      'field'    => 'slug',
      'terms'    => array('hidden'),
      'operator' => 'NOT IN',
    ),
  ),
);
$query = new WP_Query($args);

この場合、「カテゴリがnewsまたはevent」かつ「タグにhiddenが含まれていない」投稿を取得します。

meta_queryとtax_queryを組み合わせて使う

meta_querytax_queryは同時に使うことができ、より複雑な検索要件に対応できます。

$args = array(
  'post_type' => 'post',
  'meta_query' => array(
    array(
      'key' => 'featured',
      'value' => 'yes',
      'compare' => '='
    ),
  ),
  'tax_query' => array(
    array(
      'taxonomy' => 'category',
      'field'    => 'slug',
      'terms'    => array('campaign'),
    ),
  ),
);
$query = new WP_Query($args);

「カスタムフィールド featured が yes」かつ「カテゴリが campaign」の投稿を抽出します。

カスタムクエリを柔軟に構築するポイント

複雑な条件検索を構築する際は以下のポイントに注意しましょう。

  • 複数の条件を指定する際は relation キーで明示的に制御
  • meta_value_num のような型指定を忘れずに
  • post__inpost__not_in を併用することでさらに制限可能

まとめ

WP_Queryは非常に柔軟で、meta_querytax_queryを駆使すればAND/OR/NOTの複雑な組み合わせも実現可能です。ユーザーの検索体験を高めるためにも、条件の組み合わせロジックを明確に設計し、効率的なクエリを構築していきましょう。