如果当前用户是管理员或编辑者


100

如何查看当前登录用户是管理员还是编辑者?

我知道每个人如何做:

<?php if(current_user_can('editor')) { ?> 
    <!-- Stuff here for editors -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Stuff here for administrators -->
<?php } ?>

但是我如何一起工作呢?即,用户是管理员还是编辑者?


10
if( current_user_can('editor') || current_user_can('administrator') )
Shazzad 2014年

Answers:


189

第一个答案,而不是与WordPress相关的,因为它仅仅是PHP:使用逻辑“ OR”运算符:

<?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?>
    // Stuff here for administrators or editors
<?php } ?>

如果要检查两个以上的角色,则可以检查当前用户的角色是否在一系列角色中,例如:

$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
<?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?>
   // Stuff here for allowed roles
<?php } ?>

但是,current_user_can不仅可以与用户角色名称一起使用,还可以与功能一起使用。

因此,一旦编辑者和管理员都可以编辑页面,则可以更轻松地检查这些功能:

<?php if( current_user_can('edit_others_pages') ) {  ?>
    // Stuff here for user roles that can edit pages: editors and administrators
<?php } ?>

看看这里的有关功能的更多信息。


您是否需要检查is_logged_in();
罗本兹'17

3
@RobBenz不,在任何情况下。因为current_user_can()如果用户未登录,则始终返回false;如果用户未登录,wp_get_current_user()则将返回无任何角色的用户,因此,array_intersect()将始终为false。
gmazzap

1
在该current_user_can()函数的PHPDoc中,我们可以看到以下行:“ 虽然部分支持针对特定角色代替功能进行检查,但不建议采用这种做法,因为它可能会产生不可靠的结果。” 因此,我认为最好在检查用户能力时避免使用角色:-)
Erenor Paz

使用该array_intersect方法时,在服务器错误日志中显示PHP警告,提示array_intersect(): Argument #2 is not an array。这是因为要检查的用户只有一个角色吗?
Garconis

@Garconis通常它应该是一个数组。由于某种原因,对您来说它似乎不是数组。array_intersect($allowed_roles, (array)$user->roles )不会有任何问题。
gmazzap

9

首先,current_user_can()不应用于检查用户的角色,而应用于检查用户是否具有特定能力

其次,您不必担心用户的角色,而是专注于功能,而不必费心做诸如原始问题(即检查用户是管理员还是编辑者)中所问问题之类的事情。相反,如果current_user_can()按预期方式使用它(即检查用户的功能而不是其角色),则不需要条件检查包含“或”(||)测试。例如:

if ( current_user_can( 'edit_pages' ) ) { ...

edit_pages具有管理员和编辑者角色的功能,但不能具有任何较低的角色,例如作者。这就是current_user_can()预期的用法。


请注意:高级WP开发人员同意此答案。您应该尽量避免角色检查,使用功能。我目前正在从事一个具有多个角色的项目,这些角色仅具有“读取”上限。唯一的解决方案是为我检查角色。抱歉,找不到链接,这是有关WP Github的公开讨论。
比约恩

IMO,这应该是公认的答案。current_user_can通常应该用于功能,而不是角色。
阿姆斯特朗

2

如@butlerblog回复所述,您不应使用current_user_can检查角色

该声明是专门在has_cap函数的PHP文档中添加的,该函数由current_user_can

尽管部分支持使用角色代替功能进行检查,但不建议采用此做法,因为它可能会产生不可靠的结果。

正确的方式做到这一点是让用户和检查$user->roles,是这样的:

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ) {

        $user = get_userdata( get_current_user_id() );
        if( ! $user || ! $user->roles ){
            return false;
        }

        if( is_array( $role ) ){
            return array_intersect( $role, (array) $user->roles ) ? true : false;
        }

        return in_array( $role, (array) $user->roles );
    }
}

这是我用来执行此操作的一些辅助函数(因为有时我不希望仅当前用户):

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ){
        return user_has_role_by_user_id( get_current_user_id(), $role );
    }
}

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

if( ! function_exists( 'user_has_role_by_user_id' ) ){
    function user_has_role_by_user_id( $user_id, $role ) {

        $user_roles = get_user_roles_by_user_id( $user_id );

        if( is_array( $role ) ){
            return array_intersect( $role, $user_roles ) ? true : false;
        }

        return in_array( $role, $user_roles );
    }
}

然后,您可以执行以下操作:

current_user_has_role( 'editor' );

要么

current_user_has_role( array( 'editor', 'administrator' ) );


-1
<?php if( current_user_can('editor')) :
  echo "welcome";
elseif( current_user_can('member')) :
  echo "welcome";
else :
 wp_die("<h2>To view this page you must first <a href='". wp_login_url(get_permalink()) ."' title='Login'>log in</a></h2>");
endif;
?>

1
如果您能解释一下它如何帮助OP,那就太好了。
bravokeyl

您可以只查看该页面的“编辑者”或“成员”,您可以直接在generic-page.php中发布此代码
seowmx

4
请不要只是丢弃代码。添加评论和一些说明,这将如何解决发问者问题。
kraftner
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.