如何检查用户是否具有特定角色?


59

我有一个非常具体的要求,即根据当前用户的角色,在用户个人资料页面的字段标签中显示不同的文本。我似乎无法弄清楚如何检查当前使用的是否是“作者”。

我在寻找类似的功能:

is_user_in_role($user, "author");

我想这很简单,但是我搜索了很长时间却没有答案,所以我想将其发布在这里。

Answers:


113

如果仅当前用户需要,则current_user_can()同时接受角色和功能。

更新current_user_can()不再保证将角色名称传递给(请参阅#22624)。相反,您可能希望检查用户角色:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}

10
我知道这个帖子已经很久以前了,但是如果有人碰巧来到这里...请再次查看current_user_can()的文档->“不要将角色名称传递给current_user_can(),因为不能保证正常工作(请参阅#22624)。相反,您可能希望尝试由AppThemes组合使用的check user role功能。” (codex.wordpress.org/Function_Reference/current_user_can
bestprogrammerintheworld

1
^ if语句中缺少括号
Aajahid

1
@Aajahid编辑:)
拉斯特

10

我正在寻找一种使用用户ID来获取用户角色的方法。这是我想出的:

function get_user_roles_by_user_id( $user_id ) {
    $user = get_userdata( $user_id );
    return empty( $user ) ? array() : $user->roles;
}

然后,is_user_in_role()可以像下面这样实现一个函数:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}

1
我可以很好地获得分配给用户的第一个角色。
Q Studio

分配给用户的所有角色呢?
维沙尔·库马尔·萨胡

1
@Vishal Kumar,这将检查分配给用户的所有角色。
史蒂芬·哈里斯

此功能不存在,不确定该功能是旧的还是什么,但您应该使用上面的答案或我在下面发布的答案
sMyles

2

您也可以只创建一个新的用户对象:

$user = new WP_User( $user_id );

if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'Some_role', $user->roles ) ) {
    return true;
}

不知道get_user_roles_by_user_id删除了哪个版本,但是它不再可用。


当我必须调用WP_User类的其他方法时,这很方便。
贾斯汀·沃克斯

0

这是一个接受用户和角色以提高灵活性的功能:

函数my_has_role($ user,$ role){
  $ roles = $ user-> roles; 
  返回in_array($ role,(array)$ user-> roles);
}

if(my_has_role($ user,'some_role')){
  //做东西
}

0

在用户对象上调用角色$user->roles不会返回所有角色。以下是查找用户是否具有角色或能力的正确方法。(这在wp 2.0.0及更高版本中有效。)以下函数与用户ID配合使用,您可以通过以下方式获取当前用户ID:$current_user_id = get_current_user_id();

/**
 * Returns true if a user_id has a given role or capability
 * 
 * @param int $user_id
 * @param string $role_or_cap Role or Capability
 * 
 * @return boolean
 */
function my_has_role($user_id, $role_or_cap) {

    $u = new \WP_User( $user_id );
    //$u->roles Wrong way to do it as in the accepted answer.
    $roles_and_caps = $u->get_role_caps(); //Correct way to do it as wp do multiple checks to fetch all roles

    if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true ) 
       {
           return true;
       }
 }
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.