À quelle action dois-je me connecter lors de l'ajout de rôles et de fonctionnalités?

10

Je vais utiliser add_role () et $ role-> add_cap () pour configurer un nouveau rôle personnalisé et attacher une nouvelle capacité aux rôles existants.

Je me demande où est le meilleur endroit pour le faire? Évidemment, je peux le faire directement à l'intérieur de functions.php et en finir avec. Mais est-ce la meilleure pratique? Dois-je seulement le faire sur admin_init? ou devrais-je le faire sur init?

Je ne sais pas exactement quelles sont les meilleures pratiques autour de l'utilisation des hooks d'action init plutôt que de simplement laisser tomber un appel de fonction direct dans functions.php.

Merci pour votre contribution!

Tom Auger
la source

Réponses:

10

Lors de l'ajout d'un rôle et de fonctionnalités, vous n'avez besoin d'exécuter le code qu'une seule fois, car les rôles et les capacités sont enregistrés dans la base de données lors de l'utilisation de add_roleou de ->add_capfonctions, comme Andy l'a dit, vous pouvez utiliser after_setup_themepour ce type d'action, mais ajoutez une sorte de vérification pour ne le faire que s'exécute une fois, comme register_activation_hook ou en utilisant des options:

add_action('after_setup_theme','my_add_role_function');

function my_add_role_function(){
    $roles_set = get_option('my_roles_are_set');
    if(!$roles_set){
        add_role('my_role', 'my_roleUser', array(
            'read' => true, // True allows that capability, False specifically removes it.
            'edit_posts' => true,
            'delete_posts' => true,
            'upload_files' => true 
        ));
        update_option('my_roles_are_set',true);
    }
}
Bainternet
la source
Merci pour cela. Est-il vrai que add_role ou add_cap exploite TOUJOURS la base de données? Quand j'ai fouillé dans le code source, il semblait que ce n'était pas toujours le cas - c'est-à-dire: dans la plupart des méthodes de WP_Roles, il y a une vérification pour si ($ this-> use_db), ce qui me fait penser qu'il y a la possibilité que les rôles peut ne pas être toujours stocké dans la BD.
Tom Auger
De plus, plutôt que de définir un indicateur à l'aide d'options, ce qui ne me semble pas particulièrement évolutif, n'y a-t-il pas un moyen de simplement demander si le rôle a été créé? A défaut, quel mal cela ferait-il de redéfinir le rôle s'il est déjà là? Souhaitez-vous obtenir un rôle en double ou ignorerait-il simplement? En regardant à nouveau le fichier capabilities.php, je vois cela sous add_role: if (isset ($ this-> roles [$ role])) return; ce qui semble indiquer qu'il ne fera pas double emploi avec le rôle, donc pas de mal.
Tom Auger
Je ne sais pas ce que vous voulez dire mais le defualt est $use_db = true;dans la classe WP_Roles. et quant à la définition d'un indicateur à l'aide d'options, c'est un exemple, vous pouvez l'utiliser, register_activation_hookmais l'idée est que votre code ne s'exécutera qu'une seule fois et vous vous épargnerez ainsi le temps de l'excution.
Bainternet le
Je n'ai jamais vu cela à travers, mais il me semble qu'il pourrait être judicieux de mettre des changements de rôle dans un plugin, puis de profiter des crochets d'activation / désactivation pour déclencher les changements une seule fois. Quelqu'un a-t-il déjà emprunté cette voie?
mrwweb
@mrwweb qui devrait aussi bien fonctionner
Bainternet
7

Pour les plugins, j'ai réussi à l'utiliser plugins_loadedpour cela. Pour les thèmes, j'utiliserais after_setup_theme.

Andy
la source