Cara mendapatkan peran pengguna

15

Saya perlu mendapatkan peran yang dikaitkan dengan pengguna - bukan "pengguna yang saat ini masuk".

Saya menggunakan Buddypress (bukan yang seharusnya penting dengan sifat pertanyaan ini) dan saya berada di bp_members()loop.

Bagaimana saya bisa mengambil peran pengguna yang saya laporkan dalam loop pada waktu tertentu?

Terima kasih.

frank13
sumber

Jawaban:

17

Gunakan ID pengguna dan WP_User:

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

Memperbarui

/**
 * 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;
}

Contoh penggunaan:

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

Array
(
    [administrator] => Administrator
)
fuxia
sumber
Terima kasih @toscho - sepertinya tidak mendapatkan apa yang saya harapkan. Saya mendapat editor, nilai kosong / nol, dan bbp_participant. Saya mengharapkan untuk melihat Admin, Editor, Penulis atau Pelanggan karena hanya itulah peran yang kami gunakan.
frank13
@ frank13 Lihat pembaruan saya.
fuxia
2
Terima kasih @toscho ... itu banyak kode untuk mendapatkan nilai data yang saya pikir akan lebih mudah tersedia.
frank13
Sangat membantu, terima kasih! Sedih, dan membingungkan, mengapa Anda tidak dapat mengakses peran pengguna secara lebih langsung. Fungsi "pengguna" berfungsi sebagai kebalikan dari apa yang diinginkan kebanyakan orang.
Mike
7

Jika bp_membersmengembalikan array WP_Userobjek, masing-masing harus memiliki properti rolesyang berisi array peran pengguna.

Jika tidak, Anda dapat menggunakan get_user_metauntuk kunci wp_capabilities, yang akan mengembalikan array role => capabilitypasangan:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
chrisguitarguy
sumber
$ role akhirnya menjadi sebuah array. Saya mencari untuk mendapatkan $user->IDperan itu. Hanya satu peran karena tidak ada pengguna di sistem kami yang ditugaskan lebih dari 1 peran.
frank13
$roles[0], dilakukan.
chrisguitarguy
Ok, terima kasih @ChristopherDavis ... $ peran [0] mengembalikan "0" di seluruh papan untuk setiap pengguna dalam daftar
frank13
@chrisguitarguy apakah $ role [0] masih berfungsi?
T.Todua
0

Seperti yang saya mengerti, itu mungkin berubah selama bertahun-tahun, sekarang tidak 'wp_capabilities' . Saya melihat file WP inti, bagaimana mereka melakukannya sekarang, dan menemukan solusi baru untuk ini. Berikut kode yang saya gunakan sekarang:

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

$cap kemudian muncul sebagai array asosiatif, misalnya:

{
    "administrator": true
}

atau

{
    "subscriber": true
}

Jadi dalam kasus Anda, Anda mungkin harus mendapatkan kunci-kunci array:

$caps_array = array_keys( $cap );

dan kemudian mendapatkan semuanya dari itu. Saya perlu melihat apakah pengguna memiliki peran administrator, jadi saya memeriksa:

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

Saya memiliki ID pengguna, bukan seluruh WP_Userobjek, dan saya tidak ingin menggunakan solusi apa pun yang akan membuat userobjek. Ketika saya memeriksa, get_user_metalangsung ke db untuk memeriksa parameter yang tepat ini, jadi ini harus menjadi rute tercepat dan sumber daya.

Olga Farber
sumber