1

状況を考えてみましょう。メタフィールドを投稿しました:

  1. Min_Price
  2. Max_Price

したがって、すべての投稿にはこれら 2 つのフィールドがあり、値は 0 以外から 1000 までの任意の整数にすることができます。

例を見てみましょう:

  1. 投稿 #1 min_price = 5; 最大価格 = 100
  2. 投稿 #2 min_price = 50; 最大価格 = 150

query_posts で使用するカスタム オーダー ロジックを作成したいと考えています。そのため、ユーザーは価格帯を選択して、選択した値の投稿を表示できます。

1 つの価格と 1 つのフィールドしかない場合、次のように、ユーザーが価格範囲を選択して、これらの範囲に該当する投稿を取得できるようにするのは簡単です。

query_posts( array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'key' => 'price',
            'value' => array( 100, 200 ),
            'compare' => 'BETWEEN',
            'type' => 'numeric',
        )
    )
) );

したがって、ここでは価格が 100 ~ 200 のすべての投稿が表示されます。

しかし、私にはさまざまな価値観があります...そして、これはうまくいくと思いました:

query_posts( array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'key' => 'min_price',
            'value' => array( 100, 200 ),
            'compare' => 'BETWEEN',
            'type' => 'numeric',
        ),
            array(
            'key' => 'max_price',
            'value' => array( 100, 200 ),
            'compare' => 'BETWEEN',
            'type' => 'numeric',
        )
    )
) );

ここでクライアントが選択した範囲 100<->200 投稿 #1 と投稿 #2 の両方がこの範囲に収まる値を持っているため、訪問者は両方に興味を持つでしょう。残念ながら、私のクエリロジックはそれらを除外しています。

私の脳は今うまく機能していないので、単純なものが欠けています. ヒントはありますか?

4

2 に答える 2

1

あなたがしたことはうまくいくはずですが、「関係」パラメータがありません。そのはず;

                'meta_query' => array(
                    'relation' => 'AND',
                    array(
                        'key' =&gt; 'min_price',
                        'value' =&gt; array( 100, 200 ),
                        'compare' =&gt; 'BETWEEN',
                        'type' =&gt; 'numeric',
                    ),
                        array(
                        'key' =&gt; 'max_price',
                        'value' =&gt; array( 100, 200 ),
                        'compare' =&gt; 'BETWEEN',
                        'type' =&gt; 'numeric',
                    )
                )

注意すべきもう 1 つの点は、最初のインスタンスでは meta_id が「price」であり、2 番目のインスタンスでは「min_price」と「max_price」を使用していることです。これらは確実に設定されていますか?

これについて言及しているのは、最近、複数のサブ配列を持つこれらの meta_queries と、ユーザーがフォームで値を送信した AND 関係に苦労したためです (あなたの質問に対する私の理解とまったく同じです)。配列内の項目に null 値がある場合、クエリが機能しないという問題がありました。これは scribu によって修正される予定です。

http://core.trac.wordpress.org/ticket/18158

しかし、これをまったく機能させることができませんでした。髪をかきむしる。送信された値をチェックして、存在するかどうかを確認し、配列を個別に作成しました。$min_array または $max_array のいずれかが NULL の場合、クエリは機能しますが、meta_values のいずれかが NULL であり、実行している方法で構築された場合はまったく機能しません。これが理にかなっていることを願っています。私のコードは以下です。

                if ($min_price) {
                  $min_array = array('key' => 'min_price','value' => $min_price, 'value' => '=', 'type' => 'numeric');
                }

                if ($max_price) {
                  $max_array = array('key' => 'max_price','value' => $max_price, 'value' => '=', 'type' => 'numeric');
                }

                'meta_query' => array(
                    'relation' => 'AND',
                    $min_array,
                    $max_array
                ) 
于 2012-11-17T11:54:38.880 に答える
1

McNabがおそらく正しいことを除いて、あなたのやり方がうまくいくはずです(ここにはたくさんの例があります:http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters)が、私の古い答えを残します。誰かが非標準のものに役立つと思うかもしれません。

クエリ ポスト パラメーターを使用してこれを実行できるかどうかはわかりませんが、ソース コードを調べたところ、クエリは次のようになりました。

SELECT $found_rows $distinct $fields 
FROM $wpdb->posts $join 
WHERE 1=1 $where 
$groupby 
$orderby 
$limits

これらは、関連するクエリ変数に対応するフィルターです。

$where = apply_filters_ref_array('posts_where', array( $where, &$this ) );
$join = apply_filters_ref_array('posts_join', array( $join, &$this ) );

つまり、問題は SQL に還元できるということです。

function postmeta_join( $join )
{
    $join .= "
    LEFT JOIN $wpdb->postmeta AS max_price ON max_price.meta_key = 'max_price'
    LEFT JOIN $wpdb->postmeta AS min_price ON min_price.meta_key = 'min_price'";
    return $join;
}

function filter_prices($where)
{
    $where .= " AND max_price.max_price BETWEEN 100, 200 AND min_price.min_price BETWEN 100, 200";
    return $where;
}

add_filter( 'posts_where', 'filter_prices' );
add_filter( 'posts_join', 'postmeta_join' );

私はSQLの専門家ではないので、これには問題があるかもしれません。しかし、他の答えが得られない場合は、これで遊ぶことができます. (ところで、フィルターを使い終わったら、おそらくフィルターを削除したいと思うでしょう。)

于 2012-11-17T11:42:33.503 に答える