具有 2 个相等元的用户的 Wordpress 查询
Wordpress query for users who have 2 equal meta
如何让所有拥有 2 个自定义元字段 meta_1
和 meta_2
的用户的值相等?
例如:
// This user will be in the result
User 1:
meta_key : meta_1, meta_value: 6
meta_key : meta_2, meta_value: 6
// This user will also be in the result
User 2:
meta_key : meta_1, meta_value: 9001
meta_key : meta_2, meta_value: 9001
// This user will NOT be in the result
User 3:
meta_key : meta_1, meta_value: 25
meta_key : meta_2, meta_value: 6
// This user will NOT be in the result
User 4:
meta_key : meta_1, meta_value: 9001
// (this user does not have meta_2)
我这样做的方式:
向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 大师 ;)
当然 'bind' 过滤器:
add_filter('posts_join', 'my_posts_join');
$query = new WP_Query( $query_args );
remove_filter('posts_join', 'my_posts_join');
如果你想让这个过滤器应用于每个 WP_Query 而不是特定的一个,那么你应该 'bind' 它在函数之外的某个地方,最好做法是添加它before/after它调用的函数:
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
请注意 where 中有 AND,因为 $where(函数的第一个参数)实际上将包含开头。
您还应该在自定义查询字符串的开头添加一个空的 space,否则它们可能会产生无效的 SQL。
如何让所有拥有 2 个自定义元字段 meta_1
和 meta_2
的用户的值相等?
例如:
// This user will be in the result
User 1:
meta_key : meta_1, meta_value: 6
meta_key : meta_2, meta_value: 6
// This user will also be in the result
User 2:
meta_key : meta_1, meta_value: 9001
meta_key : meta_2, meta_value: 9001
// This user will NOT be in the result
User 3:
meta_key : meta_1, meta_value: 25
meta_key : meta_2, meta_value: 6
// This user will NOT be in the result
User 4:
meta_key : meta_1, meta_value: 9001
// (this user does not have meta_2)
我这样做的方式:
向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 大师 ;)
当然 'bind' 过滤器:
add_filter('posts_join', 'my_posts_join');
$query = new WP_Query( $query_args );
remove_filter('posts_join', 'my_posts_join');
如果你想让这个过滤器应用于每个 WP_Query 而不是特定的一个,那么你应该 'bind' 它在函数之外的某个地方,最好做法是添加它before/after它调用的函数:
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
请注意 where 中有 AND,因为 $where(函数的第一个参数)实际上将包含开头。
您还应该在自定义查询字符串的开头添加一个空的 space,否则它们可能会产生无效的 SQL。