Wordpress meta_query OR / AND关系不起作用

时间:2017-09-20 14:32:10

标签: php wordpress

我有一个搜索表单,其中包含多个分类标准选项。当我选择所有选项,或只选择一个,然后单击搜索时,它永远不会返回任何记录。我在理解关系以及如何正确设置数组方面存在问题。

$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 个答案:

答案 0 :(得分:1)

首先,我不确定您是否完全理解关系属性在此函数中的应用方式。它将AND/OR应用于同一级别的其他属性。因此,您的第一个relation => AND确保您的$search变量与您指定的某个属性匹配,并且property_price介于最小值和最大值之间。

其次,对于后续的嵌套元查询,默认关系为AND,因此当您尝试将$search与不同的属性匹配时,您实际上是在尝试确保{{1}匹配您指定的所有属性。您可以尝试将$search与一个属性或其他属性匹配来解决此问题。

第三,通过比较价格与最低和最高价格,元查询格式不正确,并且这两个元查询都是相同的。在这种情况下,您不需要关系,因为您只需要检查一个值。

您可以简化代码:

$search

现在,您正在制作一个查询,检查$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', ) ) ); $search还是property_address_potal_code或类似property_address_stateproperty_location介于最小值之间和最高价格。

根据代码中的其他逻辑,你可能仍然需要稍微改变它,但我认为这应该让你朝着正确的方向前进。