Como dijo la respuesta @butlerblog, no debe usar current_user_can para verificar un rol
Este aviso se agrega específicamente en la documentación de PHP de la has_cap
función a la que llamacurrent_user_can
Si bien la verificación de un rol en lugar de una capacidad se admite en parte, esta práctica se desaconseja, ya que puede producir resultados poco confiables.
La forma CORRECTA de hacer esto es obtener el usuario y verificar $user->roles
, de esta manera:
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 );
}
}
Aquí hay algunas funciones auxiliares que uso para hacer esto (ya que a veces no quiero solo el usuario actual):
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 );
}
}
Entonces puedes hacer esto:
current_user_has_role( 'editor' );
o
current_user_has_role( array( 'editor', 'administrator' ) );
if( current_user_can('editor') || current_user_can('administrator') )