WordPressでカスタムフィールドをたくさん作ったサイトとかでは、カスタムフィールドの値を条件にして投稿を取得したいケースが多々あります。
複数のカスタムフィールドの値を条件に投稿を取得する時のメモ。
条件にするカスタムフィールドが1つのとき
おさらい。
例えば product
投稿のカスタムフィールド pickup
がon
のものを取得したい場合。
meta_key
キーワードを使って指定する方法
<?php $arg = [ 'post_type' => 'product', 'meta_key' => 'pickup', 'meta_value' => 'on', 'meta_compare' => '=', // "=" はデフォルトなので省略可 ]; $the_query = new WP_Query($arg);
meta_query
で指定する場合
<?php $arg = [ 'post_type' => 'product', 'meta_query' => [ [ 'key' => 'pickup', 'value' => 'on', 'compare' => '=', // "=" はデフォルトなので省略可 ], ], ]; $the_query = new WP_Query($arg);
複数のカスタムフィールドを条件にするとき
カスタムフィールド pickup
がon
で、カスタムフィールドsale_end_at
の日付が今日より大きい product
(post_type)を取得した場合。
複数のカスタムフィールドを条件にしたい場合はmeta_query
の配列に条件を追加すればOK
<?php $arg = [ 'post_type' => 'product', 'meta_query' => [ [ 'key' => 'pickup', 'value' => 'on', ], [ 'key' => 'sale_end_at', 'value' => date( "Y-m-d" ), 'compare' => '>', ], ], ]; $the_query = new WP_Query($arg);
複数のカスタムフィールドの値を AND
で取得することができます。
複数のカスタムフィールドの条件をOR
で取得したいとき
meta_query
のカスタムフィールドの条件がある階層にrelation
で指定することができます。(relation
の指定がないとAND
になります。)
カスタムフィールドsale_end_at
の日付が今日より大きい または sale_end_at
が指定されていない(未登録) で取得したい場合。
<?php $arg = [ 'post_type' => 'product', 'meta_query' => [ 'relation' => 'OR', [ 'key' => 'sale_end_at', 'value' => date( "Y-m-d" ), 'compare' => '>', ], [ 'key' => 'sale_end_at', 'compare' => 'NOT EXISTS', ], ], ]; $the_query = new WP_Query($arg);
複数のカスタムフィールドでの複雑な条件での取得
カスタムフィールド pickup
がon
で、
カスタムフィールドsale_end_at
の日付が今日より大きい または sale_end_at
が指定されていない(未登録) で取得したいような場合... 日本語で書くとややこしい...
pickup = "on" && ( sale_end_at > TODAY || NOT EXISTS (sale_end_at) )
こんな感じの条件にしたいイメージです。
どうやら、meta_query
の配列内に配列を入れ子にして条件を作成することができるようです。
<?php $arg = [ 'post_type' => 'product', 'meta_query' => [ 'relation' => 'AND', [ 'key' => 'pickup', 'value' => 'on', 'compare' => '=', ], [ 'relation' => 'OR', [ 'key' => 'sale_end_at', 'value' => date( "Y-m-d" ), 'compare' => '>', ], [ 'key' => 'sale_end_at', 'compare' => 'NOT EXISTS', ], ], ], ]; $the_query = new WP_Query($arg);
WP_Query すごい!!
ただ、カスタムフィールドの値でORDER_BYの条件にしたい時はmeta_key
に条件にするカスタムフィールドを指定しなければならないっぽいので、上記の条件でsale_end_at
で並び替えようとするとsale_end_at
が存在しない(NOT EXISTS)な投稿は取得されなくなってしまうのでORDER_BYと併用する場合は注意が必要です。(存在しない値のものがあるとどう並び替えるねん!ってなるから当然といえば当然ですが...
<?php $arg = [ 'post_type' => 'product', 'meta_query' => [ 'relation' => 'AND', [ 'key' => 'pickup', 'value' => 'on', 'compare' => '=', ], [ 'relation' => 'OR', [ 'key' => 'sale_end_at', 'value' => date( "Y-m-d" ), 'compare' => '>', ], [ 'key' => 'sale_end_at', 'compare' => 'NOT EXISTS', ], ], ], 'meta_key' => 'sale_end_at', 'orderby' => [ 'date' => 'DESC', 'meta_value' => 'ASC', ], ]; $the_query = new WP_Query($arg);
👆sale_end_at
が NOT EXISTS
の投稿は取得されない。
並び替えが必要なら素直に2回 WP_Queryを発行するか、WP_Queryで取得した値をループさせて手動で並び替えを行うかで対処することになります。(DB問い合わせが少ないほうが良さそうかも!?
改めてWP_Queryって色々できるんだなーと知りました。
イタリア商事 ホットサンドメーカー ニュー・バウルー ダブル BW02
- 出版社/メーカー: イタリア商事
- メディア: ホーム&キッチン
- 購入: 33人 クリック: 180回
- この商品を含むブログ (16件) を見る
👆これ買ったので早く使いに行きたい。