投稿をフィルタリングするために訪問者にWP_Queryを使用しています。投稿は製品に関するものです。そのため、フィルタでは、ユーザーが最大価格と最小価格を選択できるフィールドがあります。 (ちょうどショッピングサイトのほとんどのように)。
さて、これは私がユーザー入力を集めるために使うフィルターフォームです:
<lable>Min. Price ($)</lable>
<select name="minprice">
<option value="0">0</option>
<option value="100">100</option>
<option value="200">200</option>
<option value="300">300</option>
.....
</select>
<lable>Max. Price ($)</lable>
<select name="maxprice">
<option value="100">100</option>
<option value="200">200</option>
<option value="300">300</option>
<option value="400">400</option>
.......
</select>
そしてこれが入力を処理する関数です。
function filter_search() {
$max = $GET_['maxprice'];
$min = $GET_['minprice'];
$args = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'price',
'value' => array( $min, $max ), //this is the line where i cant figure out how.
'compare' => 'BETWEEN'
)
)
);
$searched_posts = new WP_Query( $args);
return $searched_posts;
}
比較したい値に配列を使用するのは正しいですか。
これは正しいようです、私は期待通りに動作する非常によく似たコードを持っています:
function price_query_test() {
update_post_meta( 7, '_price', 10 );
update_post_meta( 12, '_price', 20 );
update_post_meta( 18, '_price', 30 );
update_post_meta( 72, '_price', 40 );
$test = new WP_Query( array(
'post_type' => 'page',
'meta_query' => array( array(
'key' => '_price',
'value' => array( '10', '25' ),
'compare' => 'BETWEEN',
) ),
'fields' => 'ids',
) );
printf( '<pre>%s</pre>', print_r( $test->posts, 1 ) );
die();
}
add_action( 'init', 'price_query_test' );
上記は私に配列を与える:
Array
(
[0] => 12
[1] => 7
)
私たちが望むなら、meta_query
に型を追加することもできます。
'meta_query' => array( array(
'key' => '_price',
'value' => array( '10', '25' ),
'compare' => 'BETWEEN',
'type' => 'NUMERIC',
) )
しかしmeta_type
がなくても期待通りに動作するようです。
WooCommerceを使用している場合、それらのメタ値は_price
であり、ではなくprice
name__であることに注意してください。