Wie überprüfe ich, ob ein Benutzer eine bestimmte Rolle innehat?

59

Ich habe eine ziemlich spezielle Anforderung, einen anderen Text in einer Feldbezeichnung auf der Benutzerprofilseite basierend auf der Rolle des aktuellen Benutzers anzuzeigen. Ich kann nicht herausfinden, wie ich überprüfen kann, ob die aktuelle Verwendung ein "Autor" ist.

Ich suche eine Funktion wie:

is_user_in_role($user, "author");

Ich stelle mir das ziemlich einfach vor, aber ich habe zu lange ohne Antwort gesucht, also dachte ich, ich würde es hier posten.

jessegavin
quelle

Antworten:

113

Wenn Sie dies nur für den aktuellen Benutzer benötigen, werden current_user_can()sowohl Rollen als auch Funktionen akzeptiert.

UPDATE : Das Übergeben eines Rollennamenscurrent_user_can() an funktioniert nicht mehr ordnungsgemäß (siehe # 22624 ). Stattdessen möchten Sie möglicherweise die Benutzerrolle überprüfen:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}
Rarst
quelle
10
Ich weiß, dass dieser Beitrag schon vor langer Zeit beantwortet wurde, aber wenn jemand hierher kommt ... sehen Sie sich die Dokumentation noch einmal für current_user_can () an -> "Übergeben Sie keinen Rollennamen an current_user_can (), da dies nicht garantiert ist funktionieren ordnungsgemäß (siehe # 22624). Stattdessen möchten Sie möglicherweise die von AppThemes zusammengestellte Funktion zum Überprüfen der Benutzerrolle ausprobieren. " ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld
1
^ In der if-Anweisung fehlt eine
eckige
1
@Aajahid bearbeitet :)
Rarst
10

Ich suchte nach einer Möglichkeit, die Rolle eines Benutzers mithilfe der Benutzer-ID zu ermitteln. Folgendes habe ich mir ausgedacht:

function get_user_roles_by_user_id( $user_id ) {
    $user = get_userdata( $user_id );
    return empty( $user ) ? array() : $user->roles;
}

Dann is_user_in_role()könnte eine Funktion wie folgt implementiert werden:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}
Stephen M. Harris
quelle
1
funktioniert gut für mich, um die erste Rolle zu einem Benutzer zugewiesen zu bekommen.
Q Studio
Was ist mit allen Rollen, die dem Benutzer zugewiesen wurden?
Vishal Kumar Sahu
1
@Vishal Kumar Hierbei werden alle dem Benutzer zugewiesenen Rollen verglichen.
Stephen M. Harris
Diese Funktion gibt es nicht, nicht sicher, ob es nur alt war oder was, aber Sie sollten die Antwort oben oder die, die ich unten gepostet habe, verwenden
sMyles
2

Sie können auch einfach ein neues Benutzerobjekt erstellen:

$user = new WP_User( $user_id );

if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'Some_role', $user->roles ) ) {
    return true;
}

Nicht sicher, welche Version get_user_roles_by_user_identfernt wurde, aber es ist keine verfügbare Funktion mehr.

sMyles
quelle
Dies ist praktisch, wenn ich andere Methoden der WP_User-Klasse aufrufen muss.
Justin Waulters
0

Hier ist eine Funktion, die einen Benutzer und eine Rolle für mehr Flexibilität akzeptiert:

Funktion my_has_role ($ user, $ role) {
  $ role = $ user-> role; 
  return in_array ($ role, (array) $ user-> role);
}

if (my_has_role ($ user, 'some_role')) {
  //Sachen machen
}
Ben
quelle
0

Das Aufrufen von Rollen für User Object $user->rolesgibt nicht alle Rollen zurück. Der richtige Weg, um herauszufinden, ob der Benutzer eine Rolle oder eine Funktion hat, ist der folgende. (Dies funktioniert in der wp-Version 2.0.0 und höher.) Die folgende Funktion funktioniert mit der Benutzer-ID, mit der Sie die aktuelle Benutzer-ID abrufen können$current_user_id = get_current_user_id();

/**
 * Returns true if a user_id has a given role or capability
 * 
 * @param int $user_id
 * @param string $role_or_cap Role or Capability
 * 
 * @return boolean
 */
function my_has_role($user_id, $role_or_cap) {

    $u = new \WP_User( $user_id );
    //$u->roles Wrong way to do it as in the accepted answer.
    $roles_and_caps = $u->get_role_caps(); //Correct way to do it as wp do multiple checks to fetch all roles

    if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true ) 
       {
           return true;
       }
 }
Waqas Bukhary
quelle