Bagaimana cara memeriksa apakah pengguna berada dalam peran tertentu?

60

Saya memiliki persyaratan yang cukup spesifik untuk menampilkan teks yang berbeda dalam label bidang pada halaman profil pengguna berdasarkan peran pengguna saat ini. Sepertinya saya tidak tahu cara memeriksa apakah penggunaan saat ini adalah "penulis".

Saya mencari fungsi seperti:

is_user_in_role($user, "author");

Saya membayangkan ini cukup sederhana, tetapi saya telah mencari terlalu lama tanpa jawaban jadi saya pikir saya akan mempostingnya di sini.

jessegavin
sumber

Jawaban:

113

Jika Anda hanya memerlukan ini untuk pengguna saat ini current_user_can()menerima peran dan kemampuan.

UPDATE : Melewati nama peran ke current_user_can()tidak lagi dijamin berfungsi dengan benar (lihat # 22624 ). Sebagai gantinya, Anda mungkin ingin memeriksa peran pengguna:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}
Jarang
sumber
10
Saya tahu posting ini dijawab sejak lama, tetapi jika seseorang kebetulan sampai di sini ... lihat dokumentasi sekali lagi untuk current_user_can () -> "Jangan berikan nama peran ke current_user_can (), karena ini tidak dijamin untuk berfungsi dengan benar (lihat # 22624). Sebaliknya, Anda mungkin ingin mencoba memeriksa fungsi peran pengguna yang disatukan oleh AppThemes. " ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld
1
^ Ada braket yang hilang dalam pernyataan if
Aajahid
1
@Aajahid diedit :)
Rarst
10

Saya sedang mencari cara untuk mendapatkan peran pengguna menggunakan id pengguna. Inilah yang saya pikirkan:

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

Kemudian, suatu is_user_in_role()fungsi dapat diimplementasikan seperti:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}
Stephen M. Harris
sumber
1
berfungsi dengan baik bagi saya untuk mendapatkan peran pertama yang ditetapkan untuk pengguna.
Q Studio
Bagaimana dengan semua peran yang diberikan kepada pengguna?
Vishal Kumar Sahu
1
@Vishal Kumar ini akan memeriksa semua peran yang ditugaskan untuk pengguna.
Stephen M. Harris
Fungsi ini tidak ada, tidak yakin apakah itu hanya tua atau apa, tetapi Anda harus menggunakan jawaban di atas atau yang saya posting di bawah ini
sMyles
2

Anda juga bisa membuat objek pengguna baru:

$user = new WP_User( $user_id );

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

Tidak yakin versi apa get_user_roles_by_user_idyang dihapus, tetapi ini bukan lagi fungsi yang tersedia.

sMyles
sumber
Ini berguna ketika saya harus memanggil metode lain dari kelas WP_User.
Justin Waulters
0

Berikut adalah fungsi yang menerima pengguna dan peran untuk fleksibilitas yang lebih besar:

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

if (my_has_role ($ user, 'some_role')) {
  // lakukan hal-hal
}
Ben
sumber
0

Memanggil peran di Objek Pengguna $user->rolestidak mengembalikan semua peran. Cara yang benar untuk mengetahui apakah pengguna memiliki peran atau kemampuan mengikuti. (Ini bekerja di wp versi 2.0.0 dan lebih tinggi.) Fungsi berikut berfungsi dengan id pengguna Anda bisa mendapatkan id pengguna saat ini$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;
       }
 }
Waqas Bukhary
sumber