web-dev-qa-db-fra.com

Autoriser les rôles sous admin à ajouter des abonnés uniquement

Je souhaite attribuer à un groupe de types d'utilisateurs (éditeur + un rôle personnalisé) la fonctionnalité add_users/create_users. Le seul problème est que je voulais limiter cette possibilité à l’ajout d’utilisateurs de type "abonné", et rien d’autre. Y a-t-il un moyen de faire cela?

6
Tomas Buteler

La première étape pour y parvenir consiste à ajouter la possibilité à create_users à un rôle donné. Vous appelez get_role, puis utilisez la méthode add_cap. Cela a seulement besoin d'être fait une fois. Voici un exemple qui le fait lors de l'activation d'un plugin.

<?php
register_activation_hook( __FILE__, 'wpse42003_activation' );
function wpse42003_activation()
{
    foreach( array( 'editor', 'your_custome_role' ) as $r )
    {
        $role = get_role( $r );
        if( $role )
            $role->add_cap( 'create_users' );
    }
}

Si vous faites cela, vous voulez probablement vous assurer de l'annuler lors de la désactivation du plugin avec remove_cap.

<?php
register_deactivation_hook( __FILE__, 'wpse42003_deactivation' );
function wpse42003_deactivation()
{
    foreach( array( 'editor', 'your_custome_role' ) as $r )
    {
        $role = get_role( $r );
        if( $role )
            $role->remove_cap( 'create_users' );
    }
}

Il s’agit maintenant de s’assurer que ces utilisateurs ne peuvent enregistrer que des abonnés. Sur la page user-new.php, la liste déroulante des rôles est générée par une fonction appelée wp_dropdown_roles, qui à son tour appelle la fonction get_editable_roles pour extraire les rôles que l'utilisateur actuel peut modifier/créer.

Heureusement pour vous, il y a un filtre qui nous permettra de modifier ce bit. Nous allons d’abord copier toutes les clés du tableau $roles, puis parcourir et désélectionner tout rôle autre que abonné de $roles - uniquement si l’utilisateur actuel dispose de l’éditeur de rôles ou de votre rôle personnalisé.

<?php
add_filter( 'editable_roles', 'wpse42003_filter_roles' );
function wpse42003_filter_roles( $roles )
{
    $user = wp_get_current_user();
    if( in_array( 'editor', $user->roles ) || in_array( 'your_custom_role', $user->roles ) )
    {
        $tmp = array_keys( $roles );
        foreach( $tmp as $r )
        {
            if( 'subscriber' == $r ) continue;
            unset( $roles[$r] );
        }
    }
    return $roles;
}

La partie bonus de ceci est que get_editable_roles est appelé avant qu'un utilisateur soit ajouté ou mis à jour - vos éditeurs ne pourront pas ajouter d'utilisateurs en insérant des options supplémentaires dans le formulaire avec JS ou quelque chose de similaire.

note: remplacez your_custom_role par les exemples ci-dessus par le nom de votre rôle.

Tout ça comme un plugin .

10
chrisguitarguy

La réponse de @chrisguitarguy est bonne. J'ai apporté une petite modification au code pour le faire fonctionner à partir d'un bureau de développement au service des clients sur une installation multi-site. Nous avions besoin de créer un rôle d'utilisateur "client", mais bien entendu, un client ne devrait pas être autorisé à ajouter un autre client à son domaine. Modifié à partir de la réponse acceptée, j'en suis venu à ceci:

/**
 * Add filter to ensure a Customer type can NOT create another Customer user
 */
add_filter( 'editable_roles', 'limit_create_user' );
function limit_create_user( $roles ){
    $user = wp_get_current_user();
    if( in_array( 'customer', $user->roles )){
        unset( $roles[ 'customer' ]);
    }
    return $roles;
}

En espérant que quelqu'un puisse en trouver une utilité dans le futur. Cela a été testé et appliqué dans WP3.9.1.

1
rkeet