Wie in der Antwort von @butlerblog angegeben, sollten Sie current_user_can nicht zum Überprüfen einer Rolle verwenden
Dieser Hinweis wurde speziell in die PHP-Dokumentation der has_cap
Funktion aufgenommen, die von aufgerufen wirdcurrent_user_can
Die Überprüfung anhand einer Rolle anstelle einer Funktion wird teilweise unterstützt. Von dieser Vorgehensweise wird jedoch abgeraten, da sie möglicherweise zu unzuverlässigen Ergebnissen führt.
Die RICHTIGE Möglichkeit, dies zu tun, besteht darin, den Benutzer zu holen und das zu überprüfen $user->roles
, wie folgt :
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 );
}
}
Hier sind einige Hilfsfunktionen, die ich dazu benutze (da ich manchmal nicht nur den aktuellen Benutzer haben möchte):
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 );
}
}
Dann können Sie dies einfach tun:
current_user_has_role( 'editor' );
oder
current_user_has_role( array( 'editor', 'administrator' ) );
if( current_user_can('editor') || current_user_can('administrator') )