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.

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
}

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 ) );
}

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.


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ś
}

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;
       }
 }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.