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

我正在寻找一个类似的函数:

is_user_in_role($user, "author");


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

#1 楼

如果仅当前用户需要此功能,则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
}


评论


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

–世界上最好的程序员
2014年1月28日在7:04

^ if语句中缺少括号

–阿贾希德
2015年6月4日在6:44



@Aajahid编辑:)

–稀有
15年6月4日在7:52

如果不使用多站点,我仍然更喜欢current_user_can('editor')的简单性

–法律
1月25日19:37

#2 楼

我正在寻找一种使用用户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 ) );
}


评论


我可以很好地工作,以将第一个角色分配给用户。

– Q Studio
2012年10月10日19:07

那么分配给用户的所有角色呢?

– Vishal Kumar Sahu
17年4月10日在7:14

@Vishal Kumar,这将检查分配给用户的所有角色。

–斯蒂芬·哈里斯(Stephen M. Harris)
17年4月10日在17:34

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

–迈尔斯
17年11月16日在0:41

#3 楼

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

$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类的其他方法时,这很方便。

–贾斯汀·沃特斯(Justin Waulters)
19-09-25在23:18

#4 楼

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

function my_has_role($user, $role) {
  $roles = $user->roles; 
  return in_array($role, (array) $user->roles);
}

if(my_has_role($user, 'some_role')) {
  //do stuff
}


#5 楼

用户对象$user->roles上的调用角色不会返回所有角色。以下是查找用户是否具有角色或能力的正确方法。 (这适用于wp 2.0.0及更高版本。)以下功能与用户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;
       }
 }

获取当前用户ID。

#6 楼

这是旧文章,但是这是一个适用于所有WordPress版本的通用功能。
if(!function_exists('is_user')):
    function is_user ($role=NULL, $user_id=NULL)
    {
        if(empty($user_id)){
            $user = wp_get_current_user();
        } else {
            if(is_numeric($user_id) && $user_id == (int)$user_id) {
                $user = get_user_by('id', (int)$user_id);
            } else if(is_string($user_id) && $email = sanitize_email($user_id)) {
                $user = get_user_by('email', $email);
            } else {
                return false;
            }
        }
        
        if(!$user) return false;
        
        return in_array( $role, (array)$user->roles, true ) !== false;
    }
endif;

使用此功能,您可以按角色或按用户ID /电子邮件搜索已登录的用户。还接受用户角色数组。