Le manque de rôles multiples m'a énervé depuis longtemps car la classe WP_User sous-jacente prend en charge plusieurs rôles. J'ai même envisagé de rechercher une solution logicielle alternative. @lpryor - après avoir lu votre message, j'ai été motivé à le mettre en œuvre moi-même.
Cela a pris un nombre étonnamment court de lignes à faire, même si j'ai dû pirater le fichier users.php car j'étais trop paresseux pour créer un plugin séparé pour le faire pour moi. De toute évidence, c'est la mauvaise façon de le faire, donc si je suis suffisamment motivé à l'avenir, je peux essayer de le faire correctement.
Si vous ne vous souciez pas de pouvoir mettre à niveau vers la dernière version de Wordpress (que vous devriez) - vous pouvez implémenter plusieurs rôles avec les extraits de code ci-dessous. Veuillez garder à l'esprit que je ne suis pas un expert wordpress. J'ai juste ouvert les fichiers pertinents et apporté les modifications sans essayer de comprendre toutes les implications de ce que je faisais. Le code me semble raisonnable mais je ne lui ferais pas confiance avec ma vie.
(J'utilise 3.2 donc vos numéros de ligne peuvent varier) Dans class-wp-users-list-table.php juste avant la ligne 150, ajoutez-en quelques-uns comme suit:
<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>
puis changez la fonction current_account pour ressembler à ceci
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();
}
Maintenant dans users.php Commentez les lignes 71-76
/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
$update = 'err_admin_role';
continue;
}
*/
Remplacez set_role à la ligne 83 par add_role
$user->add_role($_REQUEST['new_role']);
À la ligne 92, ajoutez ce qui suit (il s'agit simplement d'un copier-coller légèrement modifié de l'action de promotion - je n'ai pas vérifié que la capacité de promotion_utilisateur est appropriée pour supprimer les rôles)
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();
À la ligne 370, ajoutez ce qui suit
case 'remove_role':
$messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
break;