Wie kann man einer Benutzerrolle erlauben, einen neuen Benutzer mit einer Rolle zu erstellen, die niedriger als seine Ebene ist?


14

Ich habe drei zusätzliche Rollen in meiner Site.

  1. Arzt
  2. Rezeptionist
  3. Gast

Diese Rollen werden mit folgendem Code hinzugefügt:

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

Standardmäßig Administratorlegen Sie alle anderen Rollen an. Ich möchte diese Zuweisungsrolle jedoch auf Benutzerebene beschränken. Was ich meine ist:

  1. Administrator - sollte in der Lage sein, alle Rollenbenutzer zu erstellen - standardmäßig möglich.
  2. Arzt - sollte in der Lage sein, NUR Benutzer zu erstellen Receptionistund Guestzu rollen
  3. Empfangsmitarbeiter - sollte NUR Rollenbenutzer erstellen Guestkönnen
  4. Gast - Es dürfen keine Benutzer angelegt werden.

Wie kann das gehen? Besser, ich schaffe das ohne Plugins.

Antworten:


23

Zunächst müssen Sie der Rolle Doctorund die folgenden Funktionen hinzufügen Receptionist:

  • list_users
  • edit_users
  • create_users
  • delete_users

Jetzt können wir steuern, welche Benutzer sie erstellen / bearbeiten / löschen können. Beginnen wir mit einer "Hilfefunktion", die zurückgibt, welche Rollen ein Benutzer bearbeiten darf:

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

Und um festzulegen, welche Rollen sie einem Benutzer zuweisen können:

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

Und schließlich begrenzen Sie, welche Benutzer sie basierend auf ihrer Rolle bearbeiten / löschen können:

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

Perfekt, vielen Dank. Nachdem ich Funktionen und Ihren Code hinzugefügt habe, funktioniert es wie erwartet. Aber Doctors, Receptionistund Guestsind nicht in der Lage zu sein eigenes Profil zu bearbeiten. Ich möchte, dass sie ihr eigenes Profil bearbeiten. Wie kann ich das machen?
Riffaz Starr

Hallo TheDeadMedic. Bist du da? Ich habe deine Antwort positiv bewertet. Könnten Sie bitte meinen obigen Kommentar lesen?
Riffaz Starr

Überprüfen Sie meine Revision.
TheDeadMedic

@TheDeadMedic Ihr Code hat mir sehr geholfen. Ich habe nur ein Problem. Ich benutze dies auf einer Multisite. Und während dieser Code mein Problem löste, schuf er einen anderen. Wenn ich als Superadministrator angemeldet bin, kann ich auf den Netzwerkseiten des Superadministrators überhaupt keine Rollen auswählen. Wie löse ich das?
Jockebq

1
Dies ist eine brillante Antwort auf die Frage. Ich fand, dass Wordpress 'eigene Dokumentation in diesem Bereich gänzlich fehlte, sogar voller grammatikalischer Fehler. Dies ist eine wirklich effiziente Lösung für das Problem.
Benji

0

Die obige Antwort hat großartig funktioniert. Die Rollen müssen jedoch für Kleinbuchstaben sein

function wpse_188863_get_allowed_roles( $user ) { }

Zum Beispiel:

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

Die Groß- und Kleinschreibung der Rollen sollte in den meisten Fällen wahrscheinlich sein. Im obigen Beispiel werden sowohl der Slug als auch der Name in Groß- und Kleinschreibung angegeben. Dies ist technisch korrekt, wird jedoch nicht empfohlen.
Benji
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.