web-dev-qa-db-ja.com

WP_Queryで最大値と最小値のメタ値比較を使用する方法

投稿をフィルタリングするために訪問者に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;
}

比較したい値に配列を使用するのは正しいですか。

2
dev-jim

これは正しいようです、私は期待通りに動作する非常によく似たコードを持っています:

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であり、ではなくpricename__であることに注意してください。

1
Howdy_McGee