问题描述

我有一些这样的代码:


$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;

我想获得更多角色,还包括 contributorauthor 以及我用 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__inrole__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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。