Jak zdobyć rolę użytkownika

15

Muszę uzyskać rolę powiązaną z użytkownikiem - nie z „aktualnie zalogowanym użytkownikiem”.

Używam Buddypress (nie powinno to mieć znaczenia dla natury tego pytania) i jestem w bp_members()pętli.

Jak mogę w dowolnym momencie odzyskać rolę użytkownika, którego zgłaszam w pętli?

Dzięki.

frank13
źródło

Odpowiedzi:

17

Użyj identyfikatora użytkownika i WP_User:

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

Aktualizacja

/**
 * Get user roles by user 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;
}

Przykład użycia:

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

Array
(
    [administrator] => Administrator
)
fuxia
źródło
Dzięki @toscho - nie wydawało się, że dostałem to, czego się spodziewałem. Mam edytor, pustą / zerową wartość i bbp_participant. Spodziewałem się zobaczyć administratora, redaktora, autora lub subskrybenta, ponieważ to jedyne role, których używamy.
frank13
@ frank13 Zobacz moją aktualizację.
fuxia
2
Dzięki @toscho ... to dużo kodu, aby uzyskać wartość danych, która moim zdaniem byłaby łatwiej dostępna.
frank13
Bardzo pomocne, dzięki! Tak smutne i mylące, dlaczego nie możesz uzyskać bezpośredniego dostępu do roli użytkownika. Funkcja „może użytkownik” działa w przeciwieństwie do tego, czego chciałaby większość ludzi.
Mike
7

Jeśli bp_memberszwraca tablicę WP_Userobiektów, każdy powinien mieć właściwość roleszawierającą tablicę ról użytkowników.

W przeciwnym razie możesz użyć get_user_metaklucza wp_capabilities, który zwróci tablicę role => capabilitypar:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
chrisguitarguy
źródło
$ role kończy się tablicą. Szukam $user->IDroli. Tylko jedna rola, ponieważ żaden użytkownik w naszym systemie nie ma przypisanej więcej niż 1 roli.
frank13
$roles[0], gotowy.
chrisguitarguy,
Ok, dzięki @ChristopherDavis ... $ role [0] zwraca „0” na wszystkich
tablicach
@chrisguitarguy czy $ role [0] nadal działa?
T.Todua
0

Jak rozumiem, prawdopodobnie zmieniło się to przez lata, teraz już nie jest 'wp_capabilities'. Spojrzałem na podstawowe pliki WP, jak to robią teraz i znalazłem nowe rozwiązanie tego problemu. Oto kod, którego teraz używam:

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

$cap następnie pojawia się jako tablica asocjacyjna, na przykład:

{
    "administrator": true
}

lub

{
    "subscriber": true
}

Więc w twoim przypadku prawdopodobnie powinieneś zdobyć klucze tablicy:

$caps_array = array_keys( $cap );

a następnie wyciągnij z niego wszystko. Musiałem sprawdzić, czy użytkownik ma rolę administratora, więc sprawdziłem:

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

Miałem identyfikator użytkownika, a nie cały WP_Userobiekt, i nie chciałem używać żadnego rozwiązania, które stworzy userobiekt. Jak sprawdziłem, get_user_metaidzie prosto do db, aby sprawdzić ten dokładny parametr, więc powinna to być najszybsza i zasobooszczędna trasa.

Olga Farber
źródło