public static function argMetaQuery(Query $query, $value, &$q)
{
$currentValue = $value;
$function = function (Query $query) use(&$currentValue, &$function) {
foreach ($currentValue as $key => $mq) {
if ($key === 'relation') {
continue;
}
if (!isset($mq[0]) || !is_array($mq[0])) {
// not nested
if (empty($mq['compare']) || $mq['compare'] == '=') {
$compare = 'in';
// ”=” is handled as ”in” in meta query
} else {
$compare = $mq['compare'];
}
$value = $mq['value'];
$type = !empty($mq['type']) ? strtolower($mq['type']) : 'char';
switch ($type) {
case 'numeric':
$query->where("post_meta_num.{$mq['key']}", $compare, $value);
break;
case 'char':
default:
$query->where("post_meta.{$mq['key']}.raw", $compare, $value);
break;
}
} else {
// nested
$currentValue = $mq;
$query->bool($function, !empty($currentValue['relation']) ? $currentValue['relation'] : 'and');
}
}
};
$query->bool($function, !empty($value['relation']) ? $value['relation'] : 'and');
}