Bir kullanıcı rolünün yalnızca seviyesinden daha düşük bir rol altında yeni bir kullanıcı oluşturmasına nasıl izin verilir?


15

Sitemde üç ekstra rol var.

  1. doktor
  2. Resepsiyonist
  3. Misafir

bu roller aşağıdaki kodla eklenir:

* adding Doctor role */
$doctor_role = add_role('Doctor', __('Doctor'), array('read'=>'true'));

/* adding Receptionist role */
$receptionist_role = add_role('Receptionist', __('Receptionist'), array('read'=>'true'));

/* adding Guest role */
$guest_role = add_role('Guest', __('Guest'), array('read'=>'true'));

Varsayılan olarak Administratorrol diğer tüm rolleri oluşturur. Ancak bu atama rolünü kullanıcı düzeyiyle sınırlandırmak istiyorum. Demek istediğim ... dir:

  1. Yönetici - varsayılan olarak tüm rol kullanıcılarını oluşturabilmelidir.
  2. Doktor - SADECE kullanıcı oluşturabilir Receptionistve Guestrol oynayabilir
  3. Resepsiyonist - SADECEGuest rol kullanıcıları oluşturabilmelidir
  4. Misafir - Kullanıcı oluşturmasına izin verilmiyor .

Bunu nasıl yapabilirim? Herhangi bir eklenti kullanmadan bunu başarabilirsem daha iyi.

Yanıtlar:


24

İlk olarak, Doctorve Receptionistrolüne aşağıdaki yetenekleri eklemeniz gerekir :

  • list_users
  • edit_users
  • create_users
  • delete_users

Artık hangi kullanıcıları oluşturabileceklerini / düzenleyebileceklerini / silebileceklerini kontrol etmek için çalışabiliriz . Kullanıcının hangi rolleri düzenlemesine izin verildiğini döndürecek bir "yardımcı" işleviyle başlayalım:

/**
 * Helper function get getting roles that the user is allowed to create/edit/delete.
 *
 * @param   WP_User $user
 * @return  array
 */
function wpse_188863_get_allowed_roles( $user ) {
    $allowed = array();

    if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles
        $allowed = array_keys( $GLOBALS['wp_roles']->roles );
    } elseif ( in_array( 'Doctor', $user->roles ) ) {
        $allowed[] = 'Receptionist';
        $allowed[] = 'Guest';
    } elseif ( in_array( 'Receptionist', $user->roles ) ) {
        $allowed[] = 'Guest';
    }

    return $allowed;
}

Bir kullanıcıya hangi rolleri atayabileceklerini ayarlamak için:

/**
 * Remove roles that are not allowed for the current user role.
 */
function wpse_188863_editable_roles( $roles ) {
    if ( $user = wp_get_current_user() ) {
        $allowed = wpse_188863_get_allowed_roles( $user );

        foreach ( $roles as $role => $caps ) {
            if ( ! in_array( $role, $allowed ) )
                unset( $roles[ $role ] );
        }
    }

    return $roles;
}

add_filter( 'editable_roles', 'wpse_188863_editable_roles' );

Son olarak, rollerine göre hangi kullanıcıları düzenleyebileceklerini / silebileceklerini sınırlayın:

/**
 * Prevent users deleting/editing users with a role outside their allowance.
 */
function wpse_188863_map_meta_cap( $caps, $cap, $user_ID, $args ) {
    if ( ( $cap === 'edit_user' || $cap === 'delete_user' ) && $args ) {
        $the_user = get_userdata( $user_ID ); // The user performing the task
        $user     = get_userdata( $args[0] ); // The user being edited/deleted

        if ( $the_user && $user && $the_user->ID != $user->ID /* User can always edit self */ ) {
            $allowed = wpse_188863_get_allowed_roles( $the_user );

            if ( array_diff( $user->roles, $allowed ) ) {
                // Target user has roles outside of our limits
                $caps[] = 'not_allowed';
            }
        }
    }

    return $caps;
}

add_filter( 'map_meta_cap', 'wpse_188863_map_meta_cap', 10, 4 );

Mükemmel teşekkürler .. Yetenekleri ve kodunuzu ekledikten sonra beklediğimiz gibi çalışıyor. Ama Doctors, Receptionistve Guestde kendi profili düzenlemek mümkün değildir. Kendi profillerini düzenlemelerini istiyorum. Bunu nasıl yapabilirim?
Riffaz Starr

merhaba TheDeadMedic .. Orada mısın? Cevabınızı iptal ettim. u plz benim yukarıdaki yorum içine bakmak olabilir?
Riffaz Starr

Düzeltmemi kontrol et.
TheDeadMedic

@TheDeadMedic Kodunuz bana çok yardımcı oldu. Sadece bir sorunum var. Bunu bir Çoklu Sitede kullanıyorum. Bu kod sorunumu çözerken başka bir kod oluşturdu. Süper Yönetici olarak oturum açtığımda Süper Yönetici Ağ Sayfalarından hiçbir rol seçemiyorum. Bunu nasıl çözerim?
jockebq

1
Bu sorunun parlak bir cevabı. Wordpress'in kendi dokümantasyonunu bu alanda eksik, hatta gramer hatalarıyla buldum. Bu, soruna gerçekten etkili bir çözümdür.
Benji

0

Yukarıdaki cevap harika çalıştı. Ancak, roller için küçük harf kullanılması gerekir

function wpse_188863_get_allowed_roles( $user ) { }

Örneğin:

if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles
    $allowed = array_keys( $GLOBALS['wp_roles']->roles );
} elseif ( in_array( 'doctor', $user->roles ) ) {
    $allowed[] = 'receptionist';
    $allowed[] = 'guest';
} elseif ( in_array( 'receptionist', $user->roles ) ) {
    $allowed[] = 'guest';
}

Rollerin durumu çoğu durumda küçük harflerle yazılmalıdır. Yukarıdaki örnekte, hem bilgi hem de ad başlık durumu kullanılarak verilmiştir, bu nedenle önerilmemesine rağmen teknik olarak doğrudur.
Benji
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.