使用AND/OR方法查询多个元值



大家早上好。

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

我有一个自定义表单在我的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方法不工作,日期查询工作正常。重点是列出某个客户的所有预订(帖子类型),某个公寓的所有预订,或者某个客户在某个公寓的所有预订。

你的想法将不胜感激。

谢谢

我想如果你检查Wordpress文档,你会注意到代码中的一个错误:https://codex.wordpress.org/Class_Reference/WP_Query

特别是-在你的查询使用的参数,'关系'只能有一个值'AND'/'OR'。您目前正在使用"IN",我认为这是无效的。关系决定查询是否需要匹配下面的所有数组,还是只匹配其中的一个或多个数组。因此,在您的情况下,如果您想同时通过clientname和apartmentname进行过滤,则需要将其设置为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),
     );
}

最新更新