使用get_users获得多个角色


10

我有一些这样的代码:

$ query_args = array();
$ query_args ['fields'] = array('ID','display_name');
$ query_args ['role'] ='订户';
$ users = get_users($ query_args);
foreach($ users as $ user)$ users_array [$ user-> ID] = $ user-> display_name;

我想获得更多的角色,并且还包括contributorauthor以及使用Role Scoper插件创建的一些自定义角色,例如Manager等等。有get_users什么想法可以做到这一点吗?

谢谢

Answers:


20

快进至WordPress 4.4-将支持该role__in属性!

看起来WordPress 4.4是我们的幸运版本号,因为它将同时支持类的role__inrole__not_in属性WP_User_Query

因此,要包括订户贡献者作者角色,我们可以简单地使用:

$users = get_users( [ 'role__in' => [ 'subscriber', 'subscriber', 'author' ] ] );

查看整个故事的门票#22212


1
您已被正式称为birgireV4.4,这是新的改进版本;-)
Pieter Goosen

1
嘿嘿,这听起来也像是高级伏特加品牌(wiki);-) @PieterGoosen
birgire 2015年

18

您也可以通过一个单一的呼叫做到这一点get_users,或使用一个单一的WP_User_Query通过利用的meta_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参数,如果你有兴趣。


@ Andy-Adams感谢您的分享。这似乎只显示了我的所有角色。这还在为您工作吗?
helgatheviking

@helgatheviking具体来说,您正在比较哪些角色?这可能取决于角色名称。
安迪·亚当斯

@AndyAdams我正在尝试将其应用到我的“简单用户列表”插件中,因此我正在尝试使其适用于任何角色组合。在我的本地站点上,我尝试过使用管理员和编辑器,但在搜索结果中循环显示所有其他角色。
helgatheviking

我可能建议使用Debug Queries插件来查看正在生成的SQL查询。很多时候,这可以帮助我弄清楚为什么我得到了意外的结果。wordpress.org/plugins/debug-queries
Andy Adams

12

我设法通过使用以下功能解决了这个问题:

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();

1
这是我遇到的最好的选择。谢谢。
2012年

@blogjunkie很好奇,但是这种表现如何呢?
helgatheviking 2013年

4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

从此get_users()返回一个与作为参数给出的查询字符串匹配的用户数组。只需get_users()针对您想要的每个角色分别运行查询并合并结果。然后,您可以$users像以前一样循环浏览。


1
您能否提供更多信息,解释为什么这可以解决问题?
GhostToast

我编辑了原始答案,以更好地解释它的工作原理。
ksloan

我将其用作$users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));,并且有效。谢谢!
Guit4eva

3

使用的问题array_merge是您不能使用分页。我真的很喜欢@Andy Adams的解决方案,但是如果您要搜索许多角色,使用他的元查询将导致查询速度非常慢(内部会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'
        )
    )
);

1

您可以简单地合并更多的用户查询结果。假设您要同时包含AuthorEditor角色。为每种情况定义查询,然后使用array_merge合并为单个数组。

$xuser_query = new WP_user_query(array( 'role' => 'Author'));    
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));
$mergedRoles=array_merge($xuser_query->results,$xuser_query->results);

// further on you might want to do some sorting 
// of the resulting array of objects before looping through it:

if (!empty( $mergedRoles->results ) ) {
 foreach ( $mergedRoles->results as $user ) { 
        echo $user->display_name;
      }
 else echo "nada, no users found";


0
<?php 
$xuser_query = new WP_user_query(array( 'role' => 'Author'));    
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));

$mergedRoles=array_merge($xuser_query->results,$xuser_query->results);

// further on you might want to do some sorting 
// of the resulting array of objects before looping through it:

if (!empty( $mergedRoles) ) {

    foreach ( $mergedRoles as $user ) { 
        echo $user->display_name;
    }

} else {
    echo "nada, no users found";
}
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.