Bir kullanıcının belirli bir rolde olup olmadığı nasıl kontrol edilir?


59

Geçerli kullanıcının rolüne bağlı olarak, kullanıcı profili sayfasındaki bir alan etiketinde farklı metinler göstermek için oldukça özel bir gereksinim var. Mevcut kullanımın bir "yazar" olup olmadığını nasıl kontrol edeceğimi bilemiyorum.

Gibi bir işlev arıyorum:

is_user_in_role($user, "author");

Bunun oldukça basit olduğunu hayal ediyorum, ancak çok uzun süredir cevapsız arandım, bu yüzden buraya gönderebilirim.

Yanıtlar:


113

Sadece mevcut kullanıcı için buna ihtiyacınız varsa current_user_can(), hem rolleri hem de yetenekleri kabul eder.

GÜNCELLEME : Bir rol adını geçmenin current_user_can()artık doğru çalışması garanti edilmez (bkz. # 22624 ). Bunun yerine, kullanıcı rolünü kontrol etmek isteyebilirsiniz:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}

10
Bu yazının uzun zaman önce yanıtlandığını biliyorum, ancak birisi buraya gelirse ... current_user_can () -> "için bir kez daha belgelere bakın. düzgün çalışın (bkz. # 22624) Bunun yerine, AppThemes tarafından bir araya getirilen kullanıcı rolü işlevini kontrol etmeyi deneyebilirsiniz. " ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld

1
^
İf

1
:) düzenlenmiş @Aajahid
Rarst

10

Kullanıcı kimliğini kullanarak kullanıcının rolünü almanın bir yolunu arıyordum. İşte geldiğim şey:

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

Daha sonra, böyle bir is_user_in_role()fonksiyon uygulanabilir:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}

1
Bir kullanıcıya atanan ilk rolü almam için bana iyi gelir.
Q Studio

Peki ya kullanıcıya atanan tüm roller?
Vishal Kumar Sahu

1
@ Vishal Kumar, kullanıcıya atanan tüm rolleri kontrol eder.
Stephen M. Harris

Sadece eski, neydi bu işlev, emin değilim yoksa, ancak yukarıdaki cevabı ya da ben aşağıda yayınlanmıştır birini kullanmalıdır
sMyles

2

Ayrıca yeni bir kullanıcı nesnesi de oluşturabilirsiniz:

$user = new WP_User( $user_id );

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

Hangi sürümün get_user_roles_by_user_idkaldırıldığından emin değilim , ancak artık kullanılabilir bir işlev değil.


WP_User sınıfının diğer yöntemlerini çağırmam gerektiğinde bu kullanışlıdır.
Justin Waulters

0

İşte bir kullanıcıyı kabul eden bir fonksiyon ve daha fazla esneklik için rol:

işlev my_has_role ($ kullanıcı, $ rol) {
  $ roller = $ user-> roller; 
  return in_array ($ role, (array) $ user-> roller);
}

if (my_has_role ($ user, 'some_role'))) {
  //şeyler yapmak
}

0

Kullanıcı Nesnesindeki rolleri çağırmak $user->rolestüm rolleri döndürmez. Kullanıcının bir rolü veya yeteneği olup olmadığını bulmak için doğru yolu izler. (Bu wp sürüm 2.0.0 ve üzeri sürümlerde çalışır.) Aşağıdaki işlev, kullanıcı kimliği ile çalışır ve geçerli kullanıcı kimliğini alabilirsiniz.$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;
       }
 }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.