问题描述
我有一些这样的代码:
$query_args = array();
$query_args['fields'] = array( 'ID', 'display_name' );
$query_args['role'] = 'subscriber';
$users = get_users( $query_args );
foreach ($users as $user) $users_array[$user->ID] = $user->display_name;
我想获得更多角色,还包括 contributor
,author
以及我用 Role Scoper 插件创建的一些自定义角色。 Manager
等等任何想法如何用 get_users
这样做?
谢谢
最佳解决方案
您还可以通过使用 meta_query
参数对 get_users
进行单次调用或使用单个 WP_User_Query
进行此操作:
global $wpdb;
$blog_id = get_current_blog_id();
$user_query = new WP_User_Query( array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
'value' => 'role_one',
'compare' => 'like'
),
array(
'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
'value' => 'role_two',
'compare' => 'like'
)
)
) );
如果您有兴趣,meta_query
将从 WP_User_Query
如何处理 role
参数中获取。
次佳解决方案
我用这个功能解决了这个问题:
function get_clients() {
$users = array();
$roles = array('subscriber', 'custom_role1', 'custom_role2');
foreach ($roles as $role) :
$users_query = new WP_User_Query( array(
'fields' => 'all_with_meta',
'role' => $role,
'orderby' => 'display_name'
) );
$results = $users_query->get_results();
if ($results) $users = array_merge($users, $results);
endforeach;
return $users;
}
然后在我的主题我可以这样做:
$users_array = get_clients();
第三种解决方案
快速到 WordPress 4.4 – 它将支持 role__in
属性!
看来 WordPress 4.4 是我们的幸运版本号,因为它将支持 WP_User_Query
类的 role__in
和 role__not_in
属性。
所以要包括订阅者,贡献者和作者角色,我们可以简单地使用:
$users = get_users( [ 'role__in' => [ 'subscriber', 'subscriber', 'author' ] ] );
查看机票 #22212 的整个故事!
第四种方案
使用 array_merge
的问题是您无法使用分页。我非常喜欢 @Andy Adams 的解决方案,但是如果您正在搜索许多角色,使用他的 meta 查询将导致非常慢的查询 (内部它为每个元查询做一个新的 INNER JOIN
) 。
我的解决方案是使用正则表达式元查询:
<?php
global $wpdb;
$blog_id = get_current_blog_id();
$roles = array('editor', 'administrator');
$meta_query = array(
'key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities',
'value' => '"(' . implode('|', array_map('preg_quote', $roles)) . ')"',
'compare' => 'REGEXP'
);
$user_query = new WP_User_Query(array(
'meta_query' = array($meta_query)
));
?>
这样会产生一个如下所示的查询:
array(
'meta_query' => array(
array(
'key' => 'wp_capabilities'
'value' => '"(editor|administrator)"'
'compare' => 'REGEXP'
)
)
);
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。