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

我知道如何分别执行以下操作:

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

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


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

评论

if(current_user_can('editor')|| current_user_can('administrator'))

#1 楼

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

<?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不仅可以与用户的角色名称一起使用,而且还具有功能。

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

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

评论


您是否需要检查is_logged_in(); ?

–RobBenz
17年5月1日在11:09

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

– gmazzap♦
17年5月1日在18:46

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

– Erenor Paz
17年9月1日在9:58



当我使用array_intersect方法时,我在服务器错误日志中收到一条PHP警告,提示array_intersect():参数2不是数组。这是因为要检查的用户只有一个角色吗?

– Garconis
18年1月23日在14:44

@Garconis通常它应该是一个数组。由于某种原因,对您来说它似乎不是数组。 array_intersect($ allowed_roles,(array)$ user-> roles)可以正常工作。

– gmazzap♦
18年1月25日在7:02

#2 楼

首先,不应使用current_user_can()来检查用户的角色,而应使用current_user_can()来检查用户是否具有特定的功能。第二,而不是关注用户的角色,而是关注功能,您不必费心做诸如原始问题(即检查用户是管理员还是编辑者)中所问问题之类的事情。相反,如果按预期使用了if ( current_user_can( 'edit_pages' ) ) { ...(即检查用户的功能而不是其角色),则不需要条件检查就可以包含“或”(||)测试。例如:

current_user_can()

edit_pages既具有管理员角色又具有编辑者角色的功能,但不能具有任何较低的角色,例如作者。这就是q4312079q的预期用途。

评论


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

–比约恩
19-4-26在21:44



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

–最强
19年5月13日在21:43

为此+1,请避免通过current_user_can()检查角色。如果要按键检查角色,请执行角色检查而不是上限检查:)

–威廉·帕顿
3月5日,11:43

那么,用于显式且安全地检查用户角色的正确功能是什么?似乎很难找到(如果存在)。 @比约恩

– ViktorBorítás
4月15日晚上8:26

@ViktorBorítás此页面上有多个有效的解决方案。但是,仅当current_user_can()不是一个选项时才使用它们。另外,我的评论更多基于安全性。例如,如果您想在大多数情况下限制特定用户的内容,则功能检查足以完成此任务。

–比约恩
4月16日下午13:21

#3 楼

如@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' ) );

#4 楼

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


评论


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

–bravokeyl
16-9-29在17:32

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

–seowmx
16-9-29在17:36

请不要只是丢弃代码。添加评论和一些说明,这将如何解决发问者问题。

–卡夫纳
16-09-29在18:09

那么您的答案是每个角色的代码重复吗?

– Julix
19-10-22在17:20

#5 楼

对上述解决方案问题的正确答案通过其他方式进行编程:

if( current_user_can('administrator')) { 

<!-- only administrator will see this message -->

} else { 

        if( wp_get_current_user('editor')) {

<!-- only editor but no administrator will see this message -->

?>
<style type="text/css">#perhapsDIVremovalidentifier{
display:none;
</style>
}
<?php
} else {

<!-- the user is neither editor or administrator -->

}}  


简要说明:找到了管理员,但是如果我们推动编辑器,也可以找到该管理员。因此,我们只允许管理员通过并仅标识编辑器。

请记住,您应始终使用此代码在上面进行调用以最大程度地减少cpu代码的使用:

if(is_user_logged_in()){}


评论


这正是问题中所陈述的内容,也是作者所不想要的。

– fuxia♦
6月3日,21:15



我加了简短的说明,以免引起误会。我很难遵循其他规则。

–经销商
6月4日8:52