Как я хотел бы сделать это:
добавить дополнительный аргумент WP_Query:
$args = array(
'equal_meta' => array('meta_1', 'meta_2')
);
$query = new WP_Query($query_args);
и создать join filter для него:
function my_posts_join($join, $query) {
if(_some_security_checks_if_needed) {
$rule = $query->get('equal_meta', array());
if(!empty($rule) {
... write custom INNER JOIN using data from $rule
$join .= $customJoin
}
}
return $join;
}
я думаю, что соединение является лучшим способом, но может быть лучше ... Я не SQL гуру;)
И конечно же «привязать» этот фильтр:
add_filter('posts_join', 'my_posts_join');
$query = new WP_Query($query_args);
remove_filter('posts_join', 'my_posts_join');
Если у вас хочу этот фильтр будет применяться ко всем WP_Query, а не одной конкретной, то вы должны «привязать» его где-то за пределами функции, лучшая практика, чтобы добавить его до/после функции, которую он называет:
add_filter('posts_join', 'my_posts_join');
function my_posts_join($join, $query) { ... }
Тогда вам не нужно его удалять.
[ДОБАВЛЕНО SQL]
Простейшая SQL-запрос я мог думать:
select wu.* from wp_users wu
-- two joins ensure we get only users with existing both meta values
inner join wp_usermeta wm1 on wm1.user_id = wu.ID and wm1.meta_key = 'meta_1'
inner join wp_usermeta wm2 on wm2.user_id = wu.ID and wm2.meta_key = 'meta_2'
-- now we filter only those with the same meta
where wm1.meta_value = wm2.meta_value;
Это показывает нам потребуется два фильтра: posts_join и posts_where. Надеюсь, вам удастся создать их обоих на основе моего ответа.
$ customJoin должен выглядеть следующим образом (псевдокод):
inner join wp_usermeta wm1 on wm1.user_id = wu.ID and wm1.meta_key = $rule[0]
inner join wp_usermeta wm2 on wm2.user_id = wu.ID and wm2.meta_key = $rule[1]
$ customWhere:
AND wm1.meta_value = wm2.meta_value
Пожалуйста, обратите внимание, что в где есть и, так как $, где (функция в первый аргумент) будет фактически включать начало.
Вы также должны добавить пустое пространство в начале строки пользовательского запроса, иначе они могут привести к недействительному SQL.
Чтобы быть уверенным, что пользователь должен иметь результат meta_1 = 123 и meta_2 = 123 (ничего, кроме _6_) или нет? –
Да, они будут в результате, если значения их meta_1 и meta_2 равны :) – AVAVT