Cum obții rolul unui utilizator

18 iul. 2012, 22:39:50
Vizualizări: 36.5K
Voturi: 17

Am nevoie să obțin rolul asociat unui utilizator -- nu cel al "utilizatorului conectat în prezent".

Folosesc BuddyPress (deși acest lucru nu ar trebui să afecteze natura acestei întrebări) și mă aflu în bucla bp_members().

Cum pot obține rolul utilizatorului despre care raportez în buclă la un moment dat?

Mulțumesc.

0
Toate răspunsurile la întrebare 3
4
19

Folosește ID-ul utilizatorului și WP_User:

$user = new WP_User( $user_id );
print wp_sprintf_l( '%l', $user->roles );

Actualizare

/**
 * Obține rolurile utilizatorului după ID.
 *
 * @param  int $id
 * @return array
 */
function wpse_58916_user_roles_by_id( $id )
{
    $user = new WP_User( $id );

    if ( empty ( $user->roles ) or ! is_array( $user->roles ) )
        return array ();

    $wp_roles = new WP_Roles;
    $names    = $wp_roles->get_names();
    $out      = array ();

    foreach ( $user->roles as $role )
    {
        if ( isset ( $names[ $role ] ) )
            $out[ $role ] = $names[ $role ];
    }

    return $out;
}

Exemplu de utilizare:

print '<pre>' 
    . htmlspecialchars( 
        print_r( wpse_58916_user_roles_by_id(1), TRUE ) 
        ) 
    . '</pre>';

Array
(
    [administrator] => Administrator
)
18 iul. 2012 22:57:39
Comentarii

Mulțumesc @toscho -- nu mi-a dat ceea ce mă așteptam. Am primit un editor, o valoare goală/nulă și bbp_participant. Mă așteptam să văd Admin, Editor, Autor sau Abonat, deoarece acestea sunt singurele roluri pe care le folosim.

frank13 frank13
18 iul. 2012 23:04:58

@frank13 Vezi actualizarea mea.

fuxia fuxia
18 iul. 2012 23:15:34

Mulțumesc @toscho ... este mult cod pentru a obține o valoare pe care m-aș fi așteptat să fie mai ușor de accesat.

frank13 frank13
18 iul. 2012 23:34:23

Foarte util, mulțumesc! Este trist și derutant de ce nu poți accesa rolul utilizatorului mai direct. Funcția "can user" funcționează invers față de ceea ce și-ar dori majoritatea oamenilor.

Mike Mike
4 sept. 2013 01:44:19
5

Dacă bp_members returnează un array de obiecte WP_User, fiecare ar trebui să aibă proprietatea roles care conține un array cu rolurile utilizatorilor.

Altfel, poți utiliza get_user_meta pentru cheia wp_capabilities, care va returna un array de perechi role => capability:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
18 iul. 2012 22:58:45
Comentarii

$roles este un array. Încerc să obțin rolul $user->ID. Doar un singur rol, deoarece niciun utilizator din sistemul nostru nu are mai mult de un rol atribuit.

frank13 frank13
18 iul. 2012 23:07:23

$roles[0], gata.

chrisguitarguy chrisguitarguy
18 iul. 2012 23:09:10

Ok, mulțumesc @ChristopherDavis ... $roles[0] returnează "0" pentru toți utilizatorii din listă

frank13 frank13
18 iul. 2012 23:15:32

@chrisguitarguy funcționează încă $roles[0]?

T.Todua T.Todua
28 mai 2015 13:14:48

$roles = reset(array_keys((array)$caps));

undefined undefined
18 aug. 2020 13:46:17
0

După cum am înțeles, probabil s-a schimbat de-a lungul anilor, acum nu mai este 'wp_capabilities'. Am analizat fișierele de bază ale WP pentru a vedea cum se face acum și am găsit o nouă soluție. Iată codul pe care îl folosesc acum:

global $wpdb;
$cap = get_user_meta( $wp_user_id, $wpdb->get_blog_prefix() . 'capabilities', true );

$cap vine apoi ca un array asociativ, de exemplu:

{
    "administrator": true
}

sau

{
    "subscriber": true
}

Deci, în cazul tău, probabil ar trebui să obții cheile array-ului:

$caps_array = array_keys( $cap );

și apoi să obții totul din el. Eu aveam nevoie să verific dacă utilizatorul are rolul de administrator, așa că am făcut:

if ( is_array( $cap ) && !empty( $cap['administrator'] ) ) { return true; }

Aveam un ID de utilizator, nu întregul obiect WP_User și nu voiam să folosesc nicio soluție care ar crea obiectul user. După cum am verificat, get_user_meta merge direct în baza de date pentru a verifica acest parametru exact, deci aceasta ar trebui să fie cea mai rapidă și eficientă cale din punct de vedere al resurselor.

12 nov. 2016 16:44:39