meta_queryには「BETWEEN」というオプションがありますが、このときに渡すvalueは昇順の配列でないといけない、ということを先日知りました。
具体的には、以下のように降順で渡した配列ではBETWEENは動作しません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function custom_query($query){ if ( is_admin() || ! $query->is_main_query() ) return; if($price = $query->get('price')){ $query->set('meta_query',array( array( 'key' => 'price', 'value' => array(2000,1000), //これは動作しない 'compare' => 'BETWEEN', 'type' => 'NUMERIC' ) )); } } add_action( 'pre_get_posts', 'custom_query' ); |
配列を生成するときに数値の大小を意識するか、asort関数で昇順にしてから渡すといいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function custom_query($query){ if ( is_admin() || ! $query->is_main_query() ) return; if($price = $query->get('price')){ $val = array(2000,1000); asort($val); $query->set('meta_query',array( array( 'key' => 'price', 'value' => $val, //array(1000,2000) になっている 'compare' => 'BETWEEN', 'type' => 'NUMERIC' ) )); } } add_action( 'pre_get_posts', 'custom_query' ); |
ADs
wp-includes/meta.php というファイルの1400行目あたりでmeta_queryの挙動を定義しているのですが、以下のようなコードになっています。
1 2 3 4 5 |
case 'BETWEEN' : case 'NOT BETWEEN' : $meta_value = array_slice( $meta_value, 0, 2 ); $where = $wpdb->prepare( '%s AND %s', $meta_value ); break; |
与えられた配列から先頭2つを取り出し、 BETWEEN 1000 AND 2000 というSQL文を生成しています。
BETWEENは順番が影響しますので、ちゃんと昇順でないと動かない、というわけです。
しかしここはWordPress側がソートしてよしなにやってほしい感じがしないでもないですね(;´∀`)
ADs
コメントはまだありません。