Jak sprawdzić, czy użytkownik pełni określoną rolę?

59

Mam dość specyficzny wymóg, aby wyświetlać inny tekst w etykiecie pola na stronie profilu użytkownika w oparciu o rolę bieżącego użytkownika. Nie potrafię wymyślić, jak sprawdzić, czy obecne użycie jest „autorem”.

Szukam funkcji takiej jak:

is_user_in_role($user, "author");

Wyobrażam sobie, że jest to dość proste, ale szukałem zbyt długo bez odpowiedzi, więc pomyślałem, że opublikuję to tutaj.

jessegavin
źródło

Odpowiedzi:

113

Jeśli potrzebujesz tego tylko dla bieżącego użytkownika, current_user_can()akceptuje zarówno role, jak i możliwości.

AKTUALIZACJA : current_user_can()Nie można zagwarantować, że przekazanie nazwy roli będzie działało poprawnie (patrz # 22624 ). Zamiast tego możesz sprawdzić rolę użytkownika:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}
Rarst
źródło
10
Wiem, że dawno temu odpowiedziano na ten post, ale jeśli ktoś się tu dostanie ... spójrz jeszcze raz w dokumentację dla current_user_can () -> "Nie przekazuj nazwy roli do current_user_can (), ponieważ nie gwarantuje to, że działa poprawnie (patrz nr 22624). Zamiast tego możesz wypróbować funkcję sprawdzania roli użytkownika utworzoną przez AppThemes. ” ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld
1
^ W instrukcji if brakuje nawiasu
Aajahid
1
@Aajahid edytowane :)
Rarst
10

Szukałem sposobu na uzyskanie roli użytkownika za pomocą identyfikatora użytkownika. Oto, co wymyśliłem:

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

Następnie is_user_in_role()można zaimplementować funkcję:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}
Stephen M. Harris
źródło
1
działa dobrze dla mnie, aby przypisać pierwszą rolę użytkownikowi.
Q Studio
Co ze wszystkimi rolami przypisanymi do użytkownika?
Vishal Kumar Sahu
1
@Vishal Kumar to sprawdzi wszystkie role przypisane do użytkownika.
Stephen M. Harris
Ta funkcja nie istnieje, nie jestem pewien, czy była tylko stara czy co, ale powinieneś użyć odpowiedzi powyżej lub tej, którą zamieściłem poniżej
sMyles,
2

Możesz także po prostu utworzyć nowy obiekt użytkownika:

$user = new WP_User( $user_id );

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

Nie jestem pewien, która wersja get_user_roles_by_user_idzostała usunięta, ale nie jest to już dostępna funkcja.

sMyles
źródło
Jest to przydatne, gdy muszę wywoływać inne metody klasy WP_User.
Justin Waulters
0

Oto funkcja, która akceptuje użytkownika i rolę dla większej elastyczności:

funkcja my_has_role ($ user, $ role) {
  $ role = $ user-> role; 
  return in_array ($ rola, (tablica) $ użytkownik-> role);
}

if (my_has_role ($ user, 'some_role')) {
  //robić coś
}
Ben
źródło
0

Wywoływanie ról w $user->rolesobiekcie użytkownika nie zwraca wszystkich ról. Prawidłowy sposób sprawdzenia, czy użytkownik ma rolę lub zdolność, jest następujący. (Działa to w wersji wp 2.0.0 i nowszej). Poniższa funkcja działa z identyfikatorem użytkownika, za pomocą którego można uzyskać identyfikator bieżącego użytkownika$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
źródło