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 …' ) ?></label>
<select name="remove_role" id="remove_role">
<option value=''><?php _e( 'Remove role …' ) ?></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’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’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’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’ 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;