Gruppen von Funktionen: Benutzer mit mehreren Rollen?

9

Ich bin mir ziemlich sicher, dass ich die in WordPress eingerichteten Rollen und Funktionen verstehe: detaillierte Funktionen, die in Rollen zusammengefasst sind, die Benutzern zugewiesen werden können. Der Code sollte die detaillierten Funktionen überprüfen, nicht die Rollen (da sich die Funktionen für bestimmte Rollen ändern können). Rollen sind nicht unbedingt hierarchisch (obwohl die Standardrollen sind).

Gibt es eine Möglichkeit, Benutzern mehrere Rollen zuzuweisen? Alternativ eine Reihe von Gruppen von Funktionen haben und einem Benutzer eine oder mehrere Gruppen zuordnen? Bei der Funktionsweise meiner Website gibt es eine Reihe offensichtlicher Verantwortlichkeiten: Aktualisieren von Webseiten, Moderieren von Foren, Aktualisieren des Veranstaltungskalenders usw. Jede Verantwortung verfügt über eine Gruppe von Funktionen, die zur Ausführung der damit verbundenen Aufgaben erforderlich sind. Ich möchte einem Benutzer ermöglichen, eine oder mehrere Verantwortlichkeiten auszuführen. Benutzer A könnte also Webseiten und den Veranstaltungskalender aktualisieren, aber die Foren nicht moderieren (nicht annähernd taktvoll genug), aber Benutzer B könnte Foren moderieren, den Veranstaltungskalender aktualisieren, ist jedoch in der Nähe der Webseiten nicht zulässig.

Gibt es eine Möglichkeit, dies zu tun, ohne eine Rolle für jede mögliche Kombination von Verantwortlichkeiten zu definieren?

lpryor
quelle
Das Role Scoper-Plugin kann möglicherweise das erreichen, wonach Sie suchen.
Devin Humbert
Ich denke, das ist mehr pro Seite oder pro Post, was nicht wirklich das ist, wonach ich suche, aber ich werde ein bisschen mehr untersuchen, danke.
lpryor
@lpryor - Role Scoper verfügt über mehrere Optionen. Sie können pro Seite und pro Beitrag für Benutzer oder Gruppen steuern, aber auch pro Kategorie, pro Taxonomie und pro Beitragstyp, sodass Sie anscheinend das erreichen können, was Sie erreichen bin danach damit.
Milo
Versuchen Sie dies gist.github.com/nikolov-tmw/7808046 Fügen Sie mehrere Kontrollkästchen zur
Rollenauswahl hinzu

Antworten:

3

Das Fehlen mehrerer Rollen hat mich lange Zeit irritiert, da die zugrunde liegende WP_User-Klasse mehrere Rollen unterstützt. Ich habe sogar überlegt, nach einer alternativen Softwarelösung zu suchen. @lpryor - Nachdem ich Ihren Beitrag gelesen hatte, war ich erneut motiviert, ihn selbst umzusetzen.

Es dauerte eine überraschend kurze Anzahl von Zeilen, obwohl ich die Datei users.php hacken musste, da ich zu faul war, ein separates Plugin zu erstellen, um dies für mich zu tun. Dies ist eindeutig der falsche Weg. Wenn ich in Zukunft genug motiviert bin, kann ich versuchen, es richtig zu machen.

Wenn Sie nicht daran interessiert sind, auf die neueste Version von Wordpress zu aktualisieren (was Sie sollten), können Sie mit den folgenden Codefragmenten mehrere Rollen implementieren. Bitte denken Sie daran, dass ich kein WordPress-Experte bin. Ich habe gerade die relevanten Dateien geöffnet und die Änderungen vorgenommen, ohne zu versuchen, die vollständigen Auswirkungen meiner Aktivitäten zu verstehen. Der Code erscheint mir vernünftig, aber ich würde ihm mein Leben nicht anvertrauen.

(Ich verwende 3.2, damit Ihre Zeilennummern variieren können.) Fügen Sie in class-wp-users-list-table.php kurz vor Zeile 150 einige der folgenden hinzu:

<div class="alignleft actions">
    <label class="screen-reader-text" for="remove_role"><?php _e( 'Remove role &hellip;' ) ?></label>
    <select name="remove_role" id="remove_role">
        <option value=''><?php _e( 'Remove role &hellip;' ) ?></option>
        <?php wp_dropdown_roles(); ?>
    </select>
    <?php submit_button( __( 'Remove' ), 'secondary', 'changeit', false ); ?>
</div>

Ändern Sie dann die Funktion current_account so, dass sie ungefähr so ​​aussieht

function current_action() {
    if ( isset($_REQUEST['changeit']) ) {
        if ( !empty($_REQUEST['new_role']) )
            return 'promote';
        elseif ( !empty($_REQUEST['remove_role']) )
            return 'remove_role';
    }

    return parent::current_action();

}}

Jetzt in users.php Kommentieren Sie die Zeilen 71-76 aus

/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
    $update = 'err_admin_role';
    continue;
}
*/

Ersetzen Sie die set_role in Zeile 83 durch add_role

$user->add_role($_REQUEST['new_role']);

Fügen Sie in Zeile 92 Folgendes hinzu (Dies ist nur ein leicht bearbeitetes Kopieren und Einfügen aus der Heraufstufungsaktion - ich habe nicht überprüft, ob die Funktion "remove_user" zum Entfernen von Rollen geeignet ist).

case 'remove_role':
    check_admin_referer('bulk-users');

    if ( ! current_user_can( 'promote_users' ) )
            wp_die( __( 'You can&#8217;t edit that user.' ) );

    if ( empty($_REQUEST['users']) ) {
            wp_redirect($redirect);
            exit();
    }

    $editable_roles = get_editable_roles();
    if ( empty( $editable_roles[$_REQUEST['remove_role']] ) )
            wp_die(__('You can&#8217;t remove that role'));

    $userids = $_REQUEST['users'];
    $update = 'remove_role';
    foreach ( $userids as $id ) {
            $id = (int) $id;

            if ( ! current_user_can('promote_user', $id) )
                    wp_die(__('You can&#8217;t edit that user.'));
            // The new role of the current user must also have promote_users caps
            // Need to think this through
            /*
            if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
                    $update = 'err_admin_role';
                    continue;
            }
            */

            // If the user doesn't already belong to the blog, bail.
            if ( is_multisite() && !is_user_member_of_blog( $id ) )
                    wp_die(__('Cheatin&#8217; uh?'));

            $user = new WP_User($id);
            $user->remove_role($_REQUEST['remove_role']);
    }

    wp_redirect(add_query_arg('update', $update, $redirect));
    exit();

Fügen Sie in Zeile 370 Folgendes hinzu

case 'remove_role':
    $messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
    break;
Adi Eyal
quelle
Das sieht toll aus, @ adi-eyal, vielen Dank! Ich werde mich durcharbeiten und es ausprobieren.
lpryor
@lpryor hey, haben Sie sich nur gefragt, ob Sie es geschafft haben, mehrere Rollen zu implementieren, ohne den WP-Kerncode zu hacken? Wäre toll zu wissen! Ich konnte keine Plugins finden, möchte aber gleichzeitig den Kern-WP-Code nicht hacken. Vielen Dank!
Dashaluna
@dashaluna Ich habe es noch nicht geschafft, aber es steht fast ganz oben auf meiner Liste!
lpryor
5
Ein solcher Hacking-Kern ist nicht der richtige Weg. Dies würde bei jedem Update des WordPress-Kerns entfernt. Haken Sie es ein oder vergessen Sie es - Tut mir leid, aber dies ist (auch wenn es funktioniert) nichts, was empfohlen werden sollte.
Kaiser
Das Aktualisieren des Kerns ist keine gute Praxis. Verwenden Sie stattdessen Aktions- / Filter-Hooks.
тнє Sufi
3

Das Plugin für den Benutzerrollen- Editor verwaltet mehrere Rollen für einen Benutzer.

Nach der Installation ist Benutzer> unter jedem Benutzer die Option Funktionen. URE behandelt die erste WP-Rolle als "primäre Rolle" und ermöglicht das Hinzufügen von "anderen Rollen".

garec
quelle
0

Ich verwende das Mitglieder-Plugin zusammen mit benutzerdefinierten Funktionen.

Sie können einer Person nicht mehrere Rollen zuweisen, aber Sie können beliebige Rollen erstellen und angeben, über welche Funktionen diese Rolle verfügt.

In den Tempaltes können Sie so etwas wie current_user_can () verwenden .

Steven
quelle
Ja, das merke ich. Aber ich habe mich gefragt, ob es eine Möglichkeit gibt, nicht für jede mögliche Kombination von Verantwortlichkeiten eine eigene Rolle definieren zu müssen. Die Kombinatorik macht es vielleicht nicht viel Spaß und ist fehleranfällig.
lpryor
Ich habe nicht viel googeln gefunden. Am nächsten kam mir dieser Thread: wordpress.org/support/topic/multiple-roles-for-a-user .
Steven