web-dev-qa-db-fra.com

Ajouter des fonctionnalités utilisateur personnalisées avant ou après l'ajout du rôle d'utilisateur personnalisé?

Les fonctionnalités utilisateur personnalisées doivent-elles être ajoutées avant l'ajout du rôle d'utilisateur personnalisé ou l'inverse?

  • add_role() demande un tableau de $capabilities dans le troisième paramètre de la fonction.
  • add_cap() demande un $role auquel appliquer la capacité dans le premier paramètre de la fonction.

Les deux add_role() et add_cap() doivent être activés lors de l'activation du plugin ou du thème.

Je pensais créer les fonctionnalités utilisateur personnalisées à l’aide de add_cap() et stocker la liste des fonctionnalités dans un tableau de propriétés de classe. Créez ensuite chaque rôle d'utilisateur personnalisé à l'aide de add_role() et ajoutez les fonctionnalités nouvellement créées à partir du tableau de propriétés de classe dans le paramètre $capabilities de chaque fonction add_role() .

OR

J'ajouterais chaque rôle d'utilisateur personnalisé à l'aide de add_role() et définirais un tableau de propriétés de classe de chacune des fonctionnalités du rôle à ajouter. Ensuite, pour chacune des fonctionnalités de chaque rôle d'utilisateur personnalisé, j'ajouterais la fonctionnalité à l'aide de add_cap() .

L’ordre dans lequel les deux fonctions doivent être exécutées add_role() et add_cap() in harmonie me laisse perplexe. Toute idée sur cette situation particulière est appréciée.

Ou devrais-je tout simplement même pas utiliser add_cap() ? Puis-je configurer un ensemble de fonctionnalités pour chaque rôle d'utilisateur et les transférer dans le paramètre $capabilities de la fonction add_role() ?

6
Michael Ecklund

Il y a une raison pour laquelle add_role() a le $capabilities en tant que 3ème paramètre.

Tout d’abord, quelques informations sur ce qui se passe lorsque vous utilisez la fonction.

  1. Il appelle WP_Roles->add_role() - la méthode de classe
  2. La méthode vérifie ensuite si le rôle existe déjà. Si oui, ça avorte.
  3. L’étape suivante consiste à ajouter le rôle au tableau WP_Roles->roles[] avec le code display_name (2dakota du Nord arg) à l’entrée de la table d’options $wpdb->prefix . 'user_roles' (un tableau).

Conclusion

Ainsi, si vous n’ajoutez pas les fonctionnalités correctement lors de la création du rôle, vous enregistrez un rôle avec des fonctionnalités vides.

Une note sur le Codex

JAMAIS JAMAIS faire confiance au codex. Il n’existe tout simplement aucune fonction appelée add_cap(). Il y a seulement des méthodes de classe dans WP_Roles, WP_Role et WP_User qui sont nommées comme ceci. (Mettra à jour l'entrée du Codex si je trouve un peu de temps.)

5
kaiser

Pour tous ceux qui ont pu poser la même question ou au moins penser à la même question ... Voici comment j'ai abordé la situation.

N'oubliez pas que ce scénario implique la mise à jour d'une base d'utilisateurs existante. Des centaines d’utilisateurs ont déjà participé activement à ce site Web communautaire.

Nous étions en train de changer le système de classement du site. (Les rangs étaient des rôles d'utilisateur personnalisés.) Vous pouvez atteindre un rang plus élevé en participant davantage à la communauté. Ainsi, une fois que l'utilisateur aura atteint ses objectifs, il sera promu à un nouveau rôle d'utilisateur personnalisé avec un accès accru au site Web de la communauté.

Des rôles d'utilisateur personnalisés étaient déjà en place et attribués à chaque utilisateur de la communauté. Nous voulions simplement changer les noms des rôles d'utilisateur personnalisés, en ajouter quelques-uns et attribuer de nouveaux privilèges à ces rangs (en termes WordPress, ajoutez de nouvelles fonctionnalités pour chaque rôle d'utilisateur personnalisé).


Étape 1 - Mettre à jour la méta de l'utilisateur

Obtenez tous vos utilisateurs, déterminez leur rôle d'utilisateur personnalisé actuel, ajoutez le nouveau rôle et supprimez tous les autres rôles existants. (Nous avons sécurisé quelques-uns des rôles d'utilisateur existants, car nous voulions nous assurer qu'ils étaient conservés tels quels et qu'ils n'étaient ni modifiés ni supprimés.)

Remarque: Cette étape n'ajoute aucun rôle d'utilisateur personnalisé. Il s'agit essentiellement de mettre à jour la méta utilisateur de chaque utilisateur afin que WordPress sache quel rôle ils ont et quel rôle enregistré il devrait vérifier les autorisations ou les fonctionnalités pour plus tard.

private function update_user_roles(){
    global $wp_roles;   

    /* Don't update users with these roles. */
    $safelisted_roles = array(
        'administrator',
        'editor',
        'author',
        'contributor',
        'subscriber', 
        'bbp_moderator',
        'bbp_participant'
    );

    /* Convert existing user's role to the newly added roles. */
    $users = get_users();
    for($i = 0; $i < count($users); $i++){
        $user = new WP_User($users[$i]->ID);
        /* Skip user, if user has no roles. */
        if(is_array($user->roles) && empty($user->roles) || !is_array($user->roles)){
            continue;
        }
        foreach($user->roles as $role){
            if($role == 'rank_name'){// Existing user role
                $user->add_role('new_rank_name');// New user role
            } else{
                /* Set remaining users as Subscribers, ignoring safe-listed user roles. */
                if(!in_array($role, $safelisted_roles)){
                    $user->add_role('subscriber');// Reset everyone to default role.
                }
            }
            /* Remove the old junky roles from the user, ignoring safe-listed user roles. */
            if(!in_array($role, $safelisted_roles)){
                $user->remove_role($role);
            }
        }
    }
}

Donc, pour récapituler, nous avons essentiellement examiné chaque utilisateur, vérifié son rôle actuel et décidé de lui attribuer un nouveau rôle ou non. Si le rôle de l'utilisateur figurait dans la liste de sécurité, il restait le même.


Étape 2 - Définir les nouveaux rôles et capacités des utilisateurs

Pour que votre code soit plus ordonné et plus organisé, créez une méthode distincte pour préparer vos nouveaux rôles et fonctionnalités utilisateur. Cela vous permet de mieux gérer vos capacités pour chaque rôle d'utilisateur personnalisé et facilite l'ajout de tout, sans encombrement.

Nous avons stocké les données de cette méthode dans une propriété de classe ($this->user_capabilities), au format tableau, à utiliser à l'étape suivante.

/* Prepare specific permissions for each new user role. */
public function set_user_capabilities(){
    $this->user_capabilities[] = array(
        'role_key' => 'new_rank_one',// Registered role name
        'role_value' => 'Rank One',// Role display name
        'capabilities' => array(// Permissions
            'new_capability_one' => true,
            'new_capability_two' => false,
            'new_capability_three' => false
        )
    );
    $this->user_capabilities[] = array(
        'role_key' => 'new_rank_two',
        'role_value' => 'Rank Two',
        'capabilities' => array(
            'new_capability_one' => true,
            'new_capability_two' => true,
            'new_capability_three' => false
        )
    );
    $this->user_capabilities[] = array(
        'role_key' => 'new_rank_three',
        'role_value' => 'Rank Three',
        'capabilities' => array(
            'new_capability_one' => true,
            'new_capability_two' => true,
            'new_capability_three' => true
        )
    );
}

Tout comme un récapitulatif, la clé de la propriété de classe $this->user_capabilities est l'endroit où vous placeriez le rôle d'utilisateur personnalisé à ajouter. À l'intérieur de la matrice, contient chacune des capacités que ce rôle aura. Ces capacités permettent d’accéder plus facilement au site.

Remarque: comment les trois nouveaux rôles d'utilisateur partagent-ils les mêmes fonctionnalités? Le premier rôle utilisateur hérite uniquement de l'autorisation pour la première capacité, le deuxième rôle d'utilisateur hérite de l'autorisation pour les deux premières capacités, car il s'agit d'un rang supérieur, et le troisième rôle hérite des autorisations pour les trois capacités, car il s'agit du premier rang. et a le plus d'autorisations.


Étape 3 - Définir les autorisations partagées et créer des rôles d'utilisateur

Nous devions définir des fonctionnalités générales que tous les utilisateurs enregistrés devaient partager. Nous avons donc créé un ensemble distinct de fonctionnalités partagées avant d'ajouter chaque nouveau rôle d'utilisateur personnalisé et de les fusionner avec les fonctionnalités de chaque rôle d'utilisateur spécifique créées à l'étape 2, qui sont stockées dans la propriété de classe ($this->user_capabilities). Encore une fois, nous devons respecter nos rôles d’utilisateur sécurisés.

/* Add custom user roles for registered members. */
public function set_user_roles(){
    global $wp_roles;

    /* Global capabilities for all registered users. */
    $user_capabilities = array(
        'bp_groups' => true,
        'bp_groups_create' => true,
        'bp_groups_join' => true,
        'bp_groups_directory' => true,
        'bp_groups_search' => true
    );

    /* Don't update users with these roles. */
    $safelisted_roles = array(
        'administrator',
        'editor',
        'author',
        'contributor',
        'subscriber', 
        'bbp_moderator',
        'bbp_participant'
    );

    /* Remove old junky user roles. */
    foreach($wp_roles->get_names() as $role_name => $display_name){
        if(!in_array($role_name, $safelisted_roles)){
            $wp_roles->remove_role($role_name);
        }
    }

    /* Add new custom user roles. */
    for($i = 0; $i < count($this->user_capabilities); $i++){
        $role = $this->user_capabilities[$i];
        $capabilities = array_merge($user_capabilities, $role['capabilities']);
        $wp_roles->add_role($role['role_key'], $role['role_value'], $capabilities);
    }

}

Récapitulatif final ... Nous établissons une liste de capacités que tous les utilisateurs enregistrés devront partager, quel que soit leur rang. Nous avons ensuite supprimé chaque rôle d'utilisateur personnalisé enregistré enregistré auprès de WordPress (à moins qu'il ne soit protégé et non modifié). Nous avons ensuite procédé à la création de chacun des nouveaux rôles d'utilisateur personnalisés et attribué toutes les fonctionnalités à chaque nouveau rôle d'utilisateur. Les rôles que nous avons définis dans la méta de l'utilisateur à l'étape 1 entreront désormais en vigueur dans WordPress.


Conclusion

C'est ce qui a fonctionné pour moi. Mettez à jour toutes les métadonnées de votre utilisateur avec les rôles que vous envisagez d'ajouter. Ensuite, poursuivez avec l’inscription de nouveaux rôles d’utilisateur personnalisés avec WordPress.

2
Michael Ecklund