使用AND / OR方法进行多元元值查询。

时间:2015-06-03 14:11:38

标签: jquery wordpress

大家早上好。

我有点绞尽脑汁,因为它不应该那么困难。

我的WP后端有一个自定义表单,它需要用户选择的元值来查询数据并返回结果。这一切都是通过AJAX发送和接收的。我希望用户能够通过一个字段或两个字段进行查询。正如您所注意到的,AND和OR运算符对我不起作用。我想我正在寻找一种AND / OR方法。

//get the posted values from the search fields  
    $clientname = ($_POST['clientname']);   
    $apartmentname = ($_POST['apartmentname']);
    $date1 = ($_POST['date1']);
    $date2 = ($_POST['date2']); 

//set the dates up properly
    $datetime1 = new DateTime($date1);
    $datetime2 = new DateTime($date2);

//get bookings between two dates and by either client name 
    or apartment name or both...
    $args = array( 
        'post_type' => 'bookings',  
        'meta_query' => array(
            'relation' => 'IN',
                array(
                    'key' => 'clientname',
                    'value' => $clientname,
                ),
                array(
                    'key' => 'apartmentname',
                    'value' => $apartmentname,
                    'compare' => array('', $apartmentname),
                ),
        ),                              
        'date_query' => array(
                array(
                    'after' => $date1,
                    'before' => $date2,
                ),          
        ),
    );

显然IN方法不起作用,日期查询工作正常。重点是列出某个客户的所有预订(邮寄类型),某个公寓的所有预订,或某个公寓中某个客户的所有预订。

您的想法将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

我认为如果您查看Wordpress文档,您会发现代码中出现错误:https://codex.wordpress.org/Class_Reference/WP_Query

具体而言 - 在您用于查询的参数中,“关系”只能具有值“AND”/“OR”。您目前正在使用“IN”,我认为这是无效的。该关系确定查询是否需要匹配下面的所有数组,或者只是一个或多个数组。因此,在您的情况下,如果要按客户端名称和公寓名称进行过滤,则需要将其设置为AND;如果您只想通过与其中任何一个匹配进行过滤,则需要将其设置为OR。

例如,您可以尝试以下内容:

$args = array( 
    'post_type' => 'bookings',  
    'meta_query' => array(
    ),                              
    'date_query' => array(
            array(
                'after' => $date1,
                'before' => $date2,
            ),          
    ),
);

if( isset($clientname) && isset($apartmentname) ){ 
   $args['meta_query']['relation'] = 'AND';
} 

if(isset($clientname)){
     $args['meta_query'][] = array(
         'key' => 'clientname',
         'value' => $clientname,
     );
}

if(isset($apartmentname)){
     $args['meta_query'][] = array(
         'key' => 'apartmentname',
         'value' => $apartmentname,
         'compare' => array('', $apartmentname),
     );
}