我知道如何分别执行以下操作:
<?php if(current_user_can('editor')) { ?>
<!-- Stuff here for editors -->
<?php } ?>
<?php if(current_user_can('administrator')) { ?>
<!-- Stuff here for administrators -->
<?php } ?>
但是我该如何一起工作呢?即用户是管理员还是编辑者?
#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
评论
if(current_user_can('editor')|| current_user_can('administrator'))