it-swarm.com.de

Wie filtere ich die Rollenauswahl?

Ich weiß, dass Rollen in WordPress nicht hierarchisch sind, aber ich frage mich, ob es irgendeine Möglichkeit gibt, "Benutzer Rollen zuzuweisen". Ich kann nur sehen, ob ich Benutzer hinzufügen kann oder nicht.

Der wirkliche Kicker hier ist, dass ich mit dem Mitglieder-Plugin von Justin Tadlock eine neue Rolle namens "Clients" erstellt habe, die alle Dinge entfernt, die sie entweder nicht sehen müssen oder die sie nicht kontrollieren können sollten - was großartig funktioniert.
Aber wenn ich ihnen die Möglichkeit gebe, einen neuen Benutzer zu erstellen, können sie auch meine "Superadministrator" -Rolle auswählen, die alles sehen kann. In gewisser Weise betrügen sie das System ein bisschen.

Gibt es eine Möglichkeit, eine bestimmte Rolle zu "verbergen", damit nicht angezeigt wird, auf was ein Benutzer einen neuen Benutzer festlegen/einen Benutzer bearbeiten kann? Oder möglicherweise die Rollenkennung basierend auf ihrer Rolle aus dem Bildschirm zum Hinzufügen/Bearbeiten von Benutzern entfernen?
Ich weiß, es hört sich ein bisschen anders an, als WordPress es für Benutzerrechte tun soll, aber aus administrativer Sicht klingt es nützlich - zumindest in meinem Kopf;)

Vielen Dank!

3
Zach

Das UI-Auswahlelement

Auf user-edit.php sehen Sie das Dropdown-Menü in der Benutzeroberfläche. Der Dropdown-Wrapper <select> ist fest codiert.

Dann macht die Admin-Oberfläche eine raffinierte Sache 1) laut inline-kommentar: // Get the highest/primary role for this user. Tatsächlich wird dem Benutzer die Rolle first zugewiesen (dies müssen wir berücksichtigen).

Dann gibt es im Grunde nur einen Aufruf zu wp_dropdown_roles(). Diese Funktion macht nichts anderes, als die verfügbaren Rollen zu durchlaufen und sie in <option> -Elemente zu packen. Aber , es gibt eine tolle Sache: Es verwendet die Rollen, die von get_editable_roles() abgerufen werden. Und hier kommt die Magie! Ein Filter für den global $wp_roles->roles. Standardmäßig gibt dies all rolls zurück, aber Sie können springen und einfach die Einstellung aufheben, was Sie wollen.

// Add this as mu-plugin
function wpse32738_get_editable_roles( $editable_roles )
{
    if ( current_user_can( 'client' ) )
        // unset whatever you need here.

    return $editable_roles;
}
add_filter( 'editable_roles', 'wpse32738_get_editable_roles' );

1) Rollen sind ein "flaches" System. Eine Rolle kann Funktionen haben, die andere Funktionen außer Kraft setzen.

7
kaiser

Ich habe die Anweisungen von Kaiser befolgt und den folgenden Code geschrieben, mit dem ich einer bestimmten Rolle Benutzerverwaltungsfunktionen zuweisen und die Ausweitung von Berechtigungen auf eine integrierte Rolle verhindern kann (mein Code sollte optimiert werden, wenn Sie benutzerdefinierte Zwischenrollen definieren).

// add user-management capabilities
add_action('admin_init', function() {
  $role = get_role( 'editor' );

  $role->add_cap( 'list_users' );
  $role->add_cap( 'create_users' );
  $role->add_cap( 'edit_users' );
  $role->add_cap( 'delete_users' );
});

// prevent privilege escalation
add_filter( 'editable_roles', function( $editable_roles ) {
  if ( ! current_user_can( 'promote_users' ) ) {
    // always remove admin roles
    if ( isset($editable_roles['super_admin']) ) {
      unset( $editable_roles['super_admin'] );
    }
    unset( $editable_roles['administrator'] );

    // remove other roles conditionnaly to prevent escalation
    if ( ! current_user_can( 'editor' ) ) {
      unset( $editable_roles['editor'] );

      if ( ! current_user_can( 'author' ) ) {
        unset( $editable_roles['author'] );

        if ( ! current_user_can( 'contributor' ) ) {
          unset( $editable_roles['contributor'] );
        }
      }
    }
  }

  return $editable_roles;
});

Mit diesem Code kann einem Mitwirkenden Benutzerverwaltungsfunktionen gewährt werden, und er sollte nur in der Lage sein, andere Mitwirkende oder Abonnenten zu erstellen.

VORSICHT: Dies ist eine Hacky-Lösung, sie wurde nicht im Netzwerkmodus getestet und es wird keine Validierung der Eingaben vorgenommen: Ein böswilliger Benutzer kann die Berechtigungen immer noch eskalieren!

1
Louis-Rémi