Cum se verifică dacă un utilizator are un anumit rol?

8 dec. 2010, 17:47:46
Vizualizări: 285K
Voturi: 104

Am o cerință destul de specifică pentru a afișa text diferit într-o etichetă de câmp pe pagina de profil a utilizatorului în funcție de rolul utilizatorului curent. Nu reușesc să-mi dau seama cum să verific dacă utilizatorul curent este un "autor".

Caut o funcție de genul:

is_user_in_role($user, "author");

Îmi imaginez că este destul de simplu, dar am căutat prea mult timp fără un răspuns, așa că m-am gândit să postez aici.

0
Toate răspunsurile la întrebare 8
4
214

Dacă ai nevoie doar pentru utilizatorul curent current_user_can() acceptă atât roluri, cât și capabilități.

ACTUALIZARE: Transmiterea unui nume de rol către current_user_can() nu mai este garantată să funcționeze corect (vezi #22624). În schimb, poate doriți să verificați rolul utilizatorului:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //Utilizatorul are rolul de "autor"
}
8 dec. 2010 17:54:09
Comentarii

Știu că acest post a fost rezolvat cu mult timp în urmă, dar dacă cineva ajunge aici... uitați-vă încă o dată la documentația pentru current_user_can() -> "Nu transmiteți un nume de rol către current_user_can(), deoarece acest lucru nu este garantat să funcționeze corect (vezi #22624). În schimb, puteți încerca funcția de verificare a rolului utilizatorului creată de AppThemes." (http://codex.wordpress.org/Function_Reference/current_user_can)

bestprogrammerintheworld bestprogrammerintheworld
28 ian. 2014 09:04:11

^ Lipsește o paranteză în declarația if

Aajahid Aajahid
4 iun. 2015 09:44:27

@Aajahid editat :)

Rarst Rarst
4 iun. 2015 10:52:13

Dacă nu utilizezi multisite, prefer în continuare simplitatea current_user_can('editor')

Jules Jules
25 ian. 2020 21:37:31
4
15

Căutam o modalitate de a obține rolul unui utilizator folosind ID-ul utilizatorului. Iată ce am creat:

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

Apoi, o funcție is_user_in_role() ar putea fi implementată astfel:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}
11 iun. 2012 17:18:41
Comentarii

funcționează bine pentru mine pentru a obține primul rol atribuit unui utilizator.

Q Studio Q Studio
10 oct. 2012 22:07:41

Dar ce zici de toate rolurile atribuite utilizatorului?

Vishal Kumar Sahu Vishal Kumar Sahu
10 apr. 2017 10:14:28

@Vishal Kumar acest lucru va verifica toate rolurile atribuite utilizatorului.

Stephen M. Harris Stephen M. Harris
10 apr. 2017 20:34:55

Această funcție nu există, nu sunt sigur dacă era doar veche sau altceva, dar ar trebui să folosiți răspunsul de mai sus sau cel pe care l-am postat mai jos

sMyles sMyles
16 nov. 2017 02:41:38
0

Apelarea rolurilor pe Obiectul User $user->roles nu returnează toate rolurile. Metoda corectă pentru a afla dacă utilizatorul are un rol sau o capacitate este următoarea. (Aceasta funcționează în versiunea wp 2.0.0 și mai mare.) Următoarea funcție lucrează cu ID-ul utilizatorului, poți obține ID-ul utilizatorului curent prin $current_user_id = get_current_user_id();

/**
 * Returnează true dacă un user_id are un anumit rol sau capacitate
 * 
 * @param int $user_id
 * @param string $role_or_cap Rol sau Capacitate
 * 
 * @return boolean
 */
function my_has_role($user_id, $role_or_cap) {

    $u = new \WP_User( $user_id );
    //$u->roles Mod greșit de a face asta, ca în răspunsul acceptat.
    $roles_and_caps = $u->get_role_caps(); //Mod corect de a face asta, deoarece wp face verificări multiple pentru a prelua toate rolurile

    if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true ) 
       {
           return true;
       }
 }
2 oct. 2019 15:19:58
1
if(current_user_can('administrator')){
   code...
}
3 sept. 2021 21:51:59
Comentarii

probabil cea mai bună idee, dar ar putea fi frumos să o extindem pentru orice utilizator, nu doar pentru cel curent

Mark Kaplun Mark Kaplun
15 apr. 2022 08:56:22
1

De asemenea, poți crea pur și simplu un nou obiect utilizator:

$user = new WP_User( $user_id );

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

Nu sunt sigur în ce versiune a fost eliminată funcția get_user_roles_by_user_id, dar nu mai este o funcție disponibilă.

16 nov. 2017 02:44:06
Comentarii

Acest lucru este util atunci când trebuie să apelez alte metode ale clasei WP_User.

Justin Waulters Justin Waulters
26 sept. 2019 02:18:58
0

Iată o funcție care acceptă un utilizator și rol pentru o flexibilitate mai mare:

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

if(my_has_role($user, 'some_role')) {
  //execută acțiuni
}
29 nov. 2017 01:05:00
0

Dacă site-ul tău folosește WooCommerce, poți folosi pur și simplu:

wc_current_user_has_role( $role );

Dacă nu, poți crea funcția tu însuți copiind modul în care o face WooCommerce (combinând wc_current_user_has_role() și wc_user_has_role()):

/**
 * Verifică dacă utilizatorul curent are un anumit rol.
 *
 * @param string $role Rolul.
 * @return bool
 */
function mysite_current_user_has_role( $role ) {
    /** @var null|WP_User $user */
    $user = wp_get_current_user();

    if ( ! is_object( $user ) ) {
        $user = get_userdata( $user );
    }

    if ( ! $user || ! $user->exists() ) {
        return false;
    }

    return in_array( $role, $user->roles, true );
}
30 mai 2024 17:15:24
0

Acest articol este vechi, dar iată o funcție universală care funcționează pe toate versiunile WordPress.

if(!function_exists('is_user')):
    function is_user ($role=NULL, $user_id=NULL)
    {
        if(empty($user_id)){
            $user = wp_get_current_user();
        } else {
            if(is_numeric($user_id) && $user_id == (int)$user_id) {
                $user = get_user_by('id', (int)$user_id);
            } else if(is_string($user_id) && $email = sanitize_email($user_id)) {
                $user = get_user_by('email', $email);
            } else {
                return false;
            }
        }
        
        if(!$user) return false;
        
        return in_array( $role, (array)$user->roles, true ) !== false;
    }
endif;

Cu această funcție puteți căuta utilizatorul conectat după rol sau după ID-ul/email-ul utilizatorului. De asemenea, acceptă și array de roluri de utilizator.

27 iul. 2020 09:42:06