WordPressでカスタム検索機能を構築する際、WP_Query
を使って複数の条件を組み合わせる必要があります。基本的な検索であればcategory_name
やmeta_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_query
とtax_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__in
やpost__not_in
を併用することでさらに制限可能
まとめ
WP_Query
は非常に柔軟で、meta_query
・tax_query
を駆使すればAND/OR/NOTの複雑な組み合わせも実現可能です。ユーザーの検索体験を高めるためにも、条件の組み合わせロジックを明確に設計し、効率的なクエリを構築していきましょう。