it-swarm.com.de

Funktionsgruppen: Benutzer mit mehreren Rollen?

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 granularen Funktionen und nicht die Rollen überprüfen (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 können Sie eine Reihe von Funktionsgruppen haben und einem Benutzer eine oder mehrere Gruppen zuordnen. Die Art und Weise, wie meine Website funktioniert, hat eine Reihe von offensichtlichen 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 Aufgaben auszuführen. So könnte Benutzer A Webseiten und den Veranstaltungskalender aktualisieren, aber die Foren nicht moderieren (bei weitem nicht 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?

9
lpryor

Das Fehlen mehrerer Rollen hat mich lange irritiert, da die zugrunde liegende WP_User-Klasse mehrere Rollen unterstützt. Ich habe sogar nach einer alternativen Softwarelösung gesucht. @lpryor - Nachdem ich Ihren Beitrag gelesen hatte, war ich 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 für mich zu erstellen. Dies ist eindeutig der falsche Weg. Wenn ich in Zukunft motiviert genug bin, kann ich versuchen, es richtig zu machen.

Wenn Sie kein Interesse daran haben, 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 scheint mir vernünftig, aber ich würde ihn meinem Leben nicht anvertrauen.

(Ich verwende 3.2, daher können Ihre Zeilennummern variieren.) Fügen Sie in class-wp-users-list-table.php kurz vor Zeile 150 einige wie die 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 der users.php Kommentiere 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 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 Aktion "Bewerben". Ich habe nicht überprüft, ob die Funktion "Bewerben_Benutzer" 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;
3
Adi Eyal

User Role Editor Plugin behandelt mehrere Rollen für einen Benutzer.

Nach der Installation ist Benutzer> unter jedem Benutzer die Option Funktionen. URE behandelt die erste Rolle WP als "primäre Rolle" und ermöglicht Ihnen, "andere Rollen" hinzuzufügen.

3
garec

Ich benutze Members 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.

0
Steven