web-dev-qa-db-ja.com

カスタムフィールド「価格」による投稿のクエリ

特定の価格範囲内のすべての投稿を表示したいです。例:ユーザーが100と1000を(2つの別々のフォームフィールドに)入力した場合 - 私のサイトは100と1000の間の数値を持つpriceと呼ばれるカスタムフィールドを持つすべての投稿を表示します。

これはWP Queryのドキュメントの下にあります。しかし、私は自分のWordPressサイトのフォームからの入力に基づいてどのようにしてクエリを作成するのかについてはよくわかりません。

$args = array(
'post_type' => 'product',
'meta_query' => array(
    array(
        'key' => 'color',
        'value' => 'blue',
        'compare' => 'NOT LIKE'
    ),
    array(
        'key' => 'price',
        'value' => array( 20, 100 ),
        'type' => 'numeric',
        'compare' => 'BETWEEN'
    )
)
);
$query = new WP_Query( $args );

お時間をいただきありがとうございます。

6
Andrew Hendrie

pre_get_posts アクションを使用して、URL内のいくつかのフィルタ変数を検出し、それに応じてクエリをフィルタ処理します。

たとえば、フォームがprice_lowおよびprice_high GET変数を設定しているとします。そのため、URLは次のようになります。

domain.com/?price_low=100&price_high=1000

それからあなたのフィルタ関数はそれらの変数の存在をチェックしてmeta_queryを作成します。この例では、それがホームページのメインのクエリであるかどうかをチェックしています。カテゴリやタグなど、他の種類のクエリが行われているかどうかをチェックする方法については Conditional Tags ページをご覧ください。

function wpa_filter_home_query( $query ){
    if( $query->is_home()
    && $query->is_main_query()
    && isset( $_GET['price_low'] )
    && isset( $_GET['price_high'] ) ) {
        $meta_query = array(
            array(
                'key' => 'price',
                'value' => array( $_GET['price_low'], $_GET['price_high'] ),
                'type' => 'numeric',
                'compare' => 'BETWEEN'
            )
        );
        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'wpa_filter_home_query' );

編集 - 値を送信する簡単なフォームの例。 action属性を省略すると、フォームは現在のページに送信されます。

<form method="GET">
    <input type="text" name="price_low">
    <input type="text" name="price_high">
    <input type="submit">
</form>
6
Milo

私は Custom Query Fields プラグインを使ってこの問題を解決しました。

私はそれが1年間更新されていないのでそれがうまくいくかどうか100%確信していません、しかしそれは行く価値があるかもしれません。

0
annabwashere