La mancanza di ruoli multipli mi ha irritato per molto tempo poiché la classe WP_User sottostante supporta più ruoli. Ho anche pensato di cercare una soluzione software alternativa. @lpryor - dopo aver letto il tuo post, sono stato ri-motivato a implementarlo da solo.
Ci sono voluti un numero sorprendentemente breve di linee da fare anche se ho dovuto hackerare il file users.php da quando ero troppo pigro per creare un plugin separato per farlo per me. Chiaramente questo è il modo sbagliato di farlo, quindi se in futuro sarò abbastanza motivato, potrei provare a farlo correttamente.
Se non ti interessa poter eseguire l'aggiornamento all'ultima versione di Wordpress (che dovresti), puoi implementare più ruoli con i frammenti di codice di seguito. Tieni presente che non sono un esperto di wordpress. Ho appena aperto i file pertinenti e apportato le modifiche senza cercare di comprendere le implicazioni complete di ciò che stavo facendo. Il codice mi sembra ragionevole ma non mi fiderei della mia vita.
(Sto usando 3.2 quindi i tuoi numeri di riga possono variare) In class-wp-users-list-table.php appena prima della riga 150 aggiungine alcuni come i seguenti:
<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>
quindi cambia la funzione current_account in modo che assomigli a questo
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();
}
Ora in users.php Commenta le righe 71-76
/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
$update = 'err_admin_role';
continue;
}
*/
Sostituisci set_role nella riga 83 con add_role
$user->add_role($_REQUEST['new_role']);
Alla riga 92 aggiungi quanto segue (Questa è solo una copia e incolla leggermente modificata dall'azione di promozione - Non ho verificato per assicurarsi che la capacità di promozione_utente sia appropriata per rimuovere i ruoli)
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();
Alla riga 370 aggiungere quanto segue
case 'remove_role':
$messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
break;