Như @butlerblog đã trả lời, bạn không nên sử dụng current_user_can để kiểm tra vai trò
Thông báo này được thêm vào cụ thể trong tài liệu PHP về has_cap
chức năng được gọi bởicurrent_user_can
Mặc dù việc kiểm tra vai trò thay cho khả năng được hỗ trợ một phần, thực tế này không được khuyến khích vì nó có thể tạo ra kết quả không đáng tin cậy.
Cách ĐÚNG để làm điều này là để có được người dùng và kiểm tra $user->roles
, như thế này:
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 );
}
}
Đây là một số chức năng trợ giúp tôi sử dụng để làm điều này (vì đôi khi tôi không chỉ muốn người dùng hiện tại):
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 );
}
}
Sau đó, bạn có thể làm điều này:
current_user_has_role( 'editor' );
hoặc là
current_user_has_role( array( 'editor', 'administrator' ) );
if( current_user_can('editor') || current_user_can('administrator') )