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

9

Je suis presque sûr de comprendre les rôles et capacités configurés dans WordPress: des capacités granulaires, regroupées en rôles qui peuvent être attribués aux 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? Alternativement, avoir un certain nombre de 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 des pages Web, modération des 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. Je voudrais permettre à un utilisateur d'exécuter une ou plusieurs responsabilités. Ainsi, l'utilisateur A pourrait mettre à jour les pages Web et le calendrier des événements, mais pas modérer les forums (pas assez de tact), mais l'utilisateur B pourrait modérer les 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 possible de responsabilités, existe-t-il un moyen de le faire?

lpryor
la source
Le plugin Role Scoper peut être en mesure d'accomplir ce que vous recherchez.
Devin Humbert
Je pense que c'est plus par page ou par poste, ce qui n'est pas vraiment ce que je recherche, mais je vais enquêter un peu plus, merci.
lpryor
@lpryor - Role Scoper a plusieurs options, vous pouvez contrôler par page et par publication pour les utilisateurs ou les groupes, mais aussi par catégorie, par taxonomie et par type de publication, il semblerait donc que vous puissiez réaliser ce que vous suis après avec ça.
Milo
Essayez celui-ci gist.github.com/nikolov-tmw/7808046 Ajoutez plusieurs cases à cocher à la sélection de rôle
OzzyCzech

Réponses:

3

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 &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 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&#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;
Adi Eyal
la source
Cela a l'air super, @ adi-eyal, merci beaucoup! Je vais me débrouiller et l'essayer.
lpryor
@lpryor hey, je me demandais simplement si vous avez réussi à implémenter plusieurs rôles sans pirater le code de base WP? Ce serait génial de savoir! Je n'ai trouvé aucun plugin, mais en même temps, je ne veux pas pirater le code WP principal. Merci!
dashaluna
@dashaluna Je n'ai pas encore pu y arriver, mais ça approche du haut de ma liste!
lpryor
5
Hacker un noyau comme celui-ci n'est pas la voie à suivre. Cela serait supprimé sur toute mise à jour du noyau WordPress. Accrochez-le ou oubliez-le, mais ce n'est (même si cela fonctionne) rien qui devrait être recommandé.
kaiser
La mise à jour du noyau n'est pas une bonne pratique. Utilisez plutôt des crochets d'action / filtre.
тнє Sufi
3

Le plugin User Role Editor gère plusieurs rôles pour un utilisateur.

Une fois installé, Utilisateurs> sous chaque utilisateur est l'option Capacités. URE traite le premier rôle WP comme "rôle principal" et vous permet d'ajouter "d'autres rôles".

garec
la source
0

J'utilise le plugin Members avec des capacités créées sur mesure.

Vous ne pouvez pas attribuer plusieurs rôles à une seule personne, mais vous pouvez créer des rôles et spécifier les capacités de ce rôle.

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

Steven
la source
Oui je m'en rends compte. Mais je me demandais s'il n'y avait aucun moyen de ne pas avoir à définir un rôle distinct pour chaque combinaison possible de responsabilités. La combinatoire pourrait le rendre peu amusant et sujet aux erreurs.
lpryor
Je n'ai pas trouvé grand-chose sur Google. Le plus proche que j'ai obtenu était ce fil: wordpress.org/support/topic/multiple-roles-for-a-user .
Steven