2017-09-20 11 views
0

私は、タクソノミーである複数のオプションを持つ検索フォームを持っています。すべてのオプション、または1つだけを選択して検索をクリックすると、決してレコードが返されません。私は、関係を理解し​​、配列を適切に設定する方法に問題があります。Wordpress meta_query OR/ANDリレーションシップが機能しません

$args = array('post_type' => array('property'), 
    'order'    => 'DESC', 
    'orderby'   => 'post_date', 
    'meta_query' => array(
     'relation' => 'AND', 
     array(
      array(
       'key'  => 'property_address_postal_code', 
       'value'  => $search, 
       'compare' => 'LIKE', 
      ), 
      array(
       'key'  => 'property_address_state', 
       'value'  => $search, 
       'compare' => 'LIKE', 
      ), 
      array(
       'key'  => 'property_location', 
       'value'  => $search, 
       'compare' => 'LIKE', 
      ), 
     ), 
     array(
      'relation' => 'OR', 
      array(
       'relation' => 'AND', 
       array(
        'key'  => 'property_price', 
        'value'  => array($_GET['min-price'],$_GET['max-price']), 
        'type' => 'numeric', 
        'compare' => 'BETWEEN', 
       ), 
      ), 
      array(
       'relation' => 'AND', 
       array(
        'key'  => 'property_price', 
        'value'  => array($_GET['min-price'],$_GET['max-price']), 
        'type' => 'numeric', 
        'compare' => 'BETWEEN', 
       ), 
      ), 
     ) 
    ) 
); 

答えて

1

最初に、この機能でリレーションプロパティがどのように適用されているかわかりません。同じレベルの他のプロパティにAND/ORを適用します。最初のrelation => ANDは、$search変数が指定したプロパティの1つと一致し、property_priceが最小値と最大値の間にあることを確認します。

は第二に、それ以降、ネストされたメタクエリで、デフォルトの関係はANDあるので、あなたは異なる特性に対する$searchと一致しようとしたとき、あなたは実際に$searchは、指定したプロパティのすべてに一致していることを確認するためにしようとしています。 $searchと1つのプロパティまたは別のプロパティを照合して修正できます。

第3に、価格を最小値と最大値と比較すると、メタクエリの形式が不正であり、それらのメタクエリの両方が同一です。その場合、1つの値に対してのみチェックする必要があるため、関係は必要ありません。

次のようなコードを簡素化することができます。

$args = array('post_type' => array('property'), 
    'order'    => 'DESC', 
    'orderby'   => 'post_date', 
    'meta_query' => array(
     'relation' => 'AND', 
     array(
      'relation' => 'OR', 
      array(
       'key'  => 'property_address_postal_code', 
       'value'  => $search, 
       'compare' => 'LIKE', 
      ), 
      array(
       'key'  => 'property_address_state', 
       'value'  => $search, 
       'compare' => 'LIKE', 
      ), 
      array(
       'key'  => 'property_location', 
       'value'  => $search, 
       'compare' => 'LIKE', 
      ), 
     ), 
     array(
      'key'  => 'property_price', 
      'value'  => array($_GET['min-price'],$_GET['max-price']), 
      'type'  => 'numeric', 
      'compare' => 'BETWEEN', 
     ) 
    ) 
); 

さて、あなたは$searchproperty_address_potal_codeなどproperty_address_stateなどproperty_locationproperty_priceようなものであれば最小と最大の価格との間にあるチェックするクエリを作っています。

あなたのコードの他のロジックに応じて少しでもそれをしなければならないかもしれませんが、これは正しい方向に進むはずです。

+0

ありがとう、あなた私の星。すべてがあなたの言う通りですが、私はSQLクエリの関係を理解し​​ていますが、Wordpressのmeta_queryではそうではありません。もう一度解決に感謝します。 –

+0

私は、 'relation'がその特定の関係をデリミタとして使って各メタクエリをまとめてグルーミングするという点で、PHPのimplode()と同様にメタクエリ関数を考えています。私はあなたが少し上手に機能を理解するのを助けることを願っています! – mcon

関連する問題