Come consentire a un ruolo utente di creare un nuovo utente con un ruolo inferiore solo al suo livello?


14

Ho tre ruoli extra nel mio sito.

  1. Medico
  2. Addetto alla reception
  3. ospite

tali ruoli vengono aggiunti dal seguente codice:

* 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'));

Per impostazione predefinita, Administratorcreare tutti gli altri ruoli. Ma voglio limitare questo ruolo di assegnazione a livello di utente. Ciò che voglio dire è:

  1. Amministratore - dovrebbe essere in grado di creare tutti gli utenti ruolo - possibile per impostazione predefinita.
  2. Dottore: dovrebbe essere in grado di creare Receptioniste Guestruolo SOLO utenti
  3. Receptionist: dovrebbe essere in grado di creare SOLOGuest utenti di ruolo
  4. Ospite: non è consentito creare utenti.

Come può farlo? Meglio se riesco a raggiungere questo obiettivo senza utilizzare alcun plug-in.

Risposte:


23

Innanzitutto, è necessario aggiungere le seguenti funzionalità al ruolo Doctore Receptionist:

  • list_users
  • edit_users
  • create_users
  • delete_users

Ora possiamo metterci al lavoro controllando quali utenti possono creare / editare / eliminare. Cominciamo con una funzione "helper" che restituirà quali ruoli un utente è autorizzato a modificare:

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

E per impostare quali ruoli possono assegnare a un utente:

/**
 * 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' );

E infine, limitare quali utenti possono modificare / eliminare in base al loro ruolo:

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

Perfetto grazie mille .. Dopo aver aggiunto le funzionalità e il codice funziona come previsto. Ma Doctors, Receptioniste Guestsono in grado di modificare il proprio profilo anche. Voglio che modifichino il proprio profilo. Come posso fare ciò?
Riffaz Starr,

ciao TheDeadMedic .. ci sei? Ho votato la tua risposta. potresti guardare nel mio commento sopra ??
Riffaz Starr,

Controlla la mia revisione.
TheDeadMedic

@TheDeadMedic Il tuo codice mi ha aiutato molto. Ho solo un problema. Lo uso su un sito multiplo. E mentre questo codice ha risolto il mio problema, ne ha creato un altro. Una volta effettuato l'accesso come Super Administrator, non posso selezionare alcun ruolo dalle Pagine di rete del Super Admin. Come lo risolvo?
jockebq,

1
Questa è una risposta brillante alla domanda. Ho trovato la documentazione di Wordpress del tutto assente in quest'area, anche piena di errori grammaticali. Questa è una soluzione davvero efficiente al problema.
Benji,

0

La risposta sopra ha funzionato alla grande. Tuttavia, i ruoli devono essere in minuscolo

function wpse_188863_get_allowed_roles( $user ) { }

Per esempio:

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';
}

Il caso dei ruoli dovrebbe probabilmente essere minuscolo nella maggior parte dei casi. Nell'esempio sopra, sia la lumaca che il nome sono dati usando il case del titolo, quindi questo è tecnicamente corretto, sebbene non raccomandato.
Benji,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.