it-swarm.com.de

Wie kann man einer Benutzerrolle erlauben, einen neuen Benutzer mit einer Rolle zu erstellen, die unter seiner Ebene liegt?

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 erstellt die Rolle Administrator alle anderen Rollen. 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, Benutzer der Rollen Receptionist und Guest zu erstellenONLY
  3. Empfangsmitarbeiter - sollte in der Lage sein, Guest rollenbenutzerNURzu erstellen
  4. Gast - Nicht erlaubt Benutzer anzulegen.

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

12
Riffaz Starr

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

  • list_users
  • edit_users
  • create_users
  • delete_users

Jetzt können wir mit dem Steuern welcher Benutzer arbeiten, die 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 );
21
TheDeadMedic

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