Answers:
第一个答案,而不是与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();
?
current_user_can()
如果用户未登录,则始终返回false;如果用户未登录,wp_get_current_user()
则将返回无任何角色的用户,因此,array_intersect()
将始终为false。
current_user_can()
函数的PHPDoc中,我们可以看到以下行:“ 虽然部分支持针对特定角色代替功能进行检查,但不建议采用这种做法,因为它可能会产生不可靠的结果。” 因此,我认为最好在检查用户能力时避免使用角色:-)
array_intersect
方法时,在服务器错误日志中显示PHP警告,提示array_intersect(): Argument #2 is not an array
。这是因为要检查的用户只有一个角色吗?
array_intersect($allowed_roles, (array)$user->roles )
不会有任何问题。
首先,current_user_can()
不应用于检查用户的角色,而应用于检查用户是否具有特定能力。
其次,您不必担心用户的角色,而是专注于功能,而不必费心做诸如原始问题(即检查用户是管理员还是编辑者)中所问问题之类的事情。相反,如果current_user_can()
按预期方式使用它(即检查用户的功能而不是其角色),则不需要条件检查包含“或”(||)测试。例如:
if ( current_user_can( 'edit_pages' ) ) { ...
edit_pages具有管理员和编辑者角色的功能,但不能具有任何较低的角色,例如作者。这就是current_user_can()
预期的用法。
current_user_can
通常应该用于功能,而不是角色。
如@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' ) );
<?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;
?>
if( current_user_can('editor') || current_user_can('administrator') )