web-dev-qa-db-fra.com

Groupes de capacités: utilisateurs avec plusieurs rôles?

Je suis presque certain de comprendre les rôles et les fonctionnalités définis dans WordPress: des fonctionnalités granulaires regroupées dans des rôles pouvant être attribués à des utilisateurs. Le code doit vérifier les capacités granulaires, pas les rôles (car les capacités de rôles particuliers peuvent changer). Les rôles ne sont pas nécessairement hiérarchiques (bien que les rôles par défaut le soient).

Existe-t-il un moyen d'attribuer plusieurs rôles aux utilisateurs? Vous pouvez également disposer de plusieurs groupes de capacités et associer un ou plusieurs groupes à un utilisateur? Le fonctionnement de mon site comporte un certain nombre de responsabilités évidentes: mise à jour de pages Web, modération de forums, mise à jour du calendrier des événements, etc. Chaque responsabilité possède un groupe de capacités nécessaires pour effectuer les tâches qui lui sont associées. J'aimerais permettre à un utilisateur d'assumer une ou plusieurs responsabilités. Ainsi, l’utilisateur A peut mettre à jour les pages Web et le calendrier des événements sans modérer les forums (mais pas assez avec tact), mais l’utilisateur B peut modérer des forums, mettre à jour le calendrier des événements, mais n’est pas autorisé à proximité des pages Web.

À moins de définir un rôle pour chaque combinaison de responsabilités possible, existe-t-il un moyen de le faire?

9
lpryor

Le manque de rôles multiples m'a irrité depuis longtemps, car la classe WP_User sous-jacente prend en charge plusieurs rôles. J'ai même envisagé de chercher une solution logicielle alternative. @ lpryor - après avoir lu votre message, j'ai été re-motivé pour le mettre en œuvre moi-même.

Il m'a fallu un nombre de lignes étonnamment court, bien que je sois obligé de pirater le fichier users.php, car j'étais trop paresseux pour créer un plugin séparé. Il est clair que ce n'est pas la bonne façon de le faire, alors si je suis suffisamment motivé à l'avenir, je pourrai essayer de le faire correctement.

Si vous ne vous souciez pas de pouvoir passer à la dernière version de Wordpress (ce que vous devriez faire), vous pouvez implémenter plusieurs rôles avec les extraits de code ci-dessous. S'il vous plaît gardez à l'esprit que je ne suis pas un expert wordpress. Je viens d'ouvrir les fichiers pertinents et de faire 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.

(J'utilise 3.2 pour que vos numéros de ligne puissent varier) Dans class-wp-users-list-table.php juste avant la ligne 150, ajoutez-en quelques-unes, comme suit:

<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>

puis changez la fonction current_account pour qu'elle ressemble à 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 le set_role de 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é à partir de l'action de promotion - je n'ai pas vérifié si la fonctionnalité promoteur_utilisateur est appropriée pour supprimer des rôles)

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();

À la ligne 370, ajoutez ce qui suit

case 'remove_role':
    $messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
    break;
3
Adi Eyal

Plug-in User Role Editor gère plusieurs rôles pour un utilisateur.

Une fois installé, Utilisateurs> sous chaque utilisateur est l’option Fonctions. URE considère le premier rôle WP comme un "rôle principal" et vous permet d'ajouter "d'autres rôles".

3
garec

J'utilise Membres plugin avec des fonctionnalités personnalisées.

Vous ne pouvez pas attribuer plusieurs rôles à une seule personne, mais vous pouvez créer n'importe quel rôle et spécifier les fonctionnalités de ce rôle.

Dans les tempaltes, vous pouvez utiliser quelque chose comme current_user_can () .

0
Steven