Comme @butlerblog Reply a déclaré, vous ne devriez pas utiliser current_user_can pour vérifier un rôle
Cet avis est spécifiquement ajouté dans la documentation PHP de la has_cap
fonction appelée parcurrent_user_can
Bien que la prise en charge d'un rôle au lieu d'une capacité soit partiellement prise en charge, cette pratique est déconseillée car elle peut produire des résultats peu fiables.
La bonne façon de faire est d’obtenir l’utilisateur et de vérifier $user->roles
, comme ceci:
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 );
}
}
Voici quelques fonctions d'aide que j'utilise pour faire ceci (comme parfois je ne veux pas que l'utilisateur actuel):
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 );
}
}
Ensuite, vous pouvez simplement faire ceci:
current_user_has_role( 'editor' );
ou
current_user_has_role( array( 'editor', 'administrator' ) );
if( current_user_can('editor') || current_user_can('administrator') )