大家早上好。
我有点绞尽脑汁,因为它不应该这么难。
我有一个自定义表单在我的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),
);
}