J'ai été surpris de découvrir que add_role () modifie la base de données et échoue si le rôle existe déjà. Il y a deux implications ici, une première plus sérieuse que l'autre: 1) si vous êtes en développement et mettez à jour votre code add_role, vous devez d'abord remove_role () 2) une fois que vous l'avez bien compris, vous ne devriez jamais avoir à exécuter ce code encore.
En règle générale, je mets add_role () dans un hook d’action wp_loaded. Et depuis que je suis en développement, j'ai également ajouté un remove_role () avant mon add_role afin que je puisse être sûr que si je modifie ma liste de caps, cela prendra réellement effet.
Mais il est clair que ceci est maintenant exécuté à chaque fois qu'une page du blog est consultée. D'accord, je pourrais le mettre dans une action réservée aux administrateurs ou créer une page de plug-in, sous Utilisateurs ou Outils, où ce rôle peut être créé une fois. J'espère que j'espère qu'il existe une solution plus simple et plus élégante.
Je n'imagine pas qu'il y ait un genre d'action run_once est-ce là?
Ou bien la meilleure pratique consiste-t-elle simplement à ajouter le rôle, puis à utiliser add_cap () plusieurs fois? Et même alors, j'imagine qu'add_cap accède à la base de données.
Il suffit de penser au meilleur moyen de réduire l’accès inutile à la base de données. Quelles sont vos meilleures pratiques?
Les rôles et fonctionnalités de l'utilisateur sont enregistrés dans la base de données. Une fois que vous avez utilisé add_role()
, vous le sauvegardez, puis chargez ensuite WordPress le connaîtra, tout comme les rôles intégrés.
Maintenant, si vous regardez la fonction add_role()
plus spécifiquement à la ligne 141 , vous verrez qu’elle enregistre le rôle et les fonctionnalités de la base de données uniquement si var $use_db
est défini sur true (qu’il est par défaut) afin que vous puissiez simplement changez-le avant d'appeler votre fonction add_role()
et le rôle ne sera pas enregistré.
essayer:
//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );
Mettre à jour:
Si c'est dans un environnement de test/développement, je ne vois pas d'inconvénient, mais si vous êtes dans un environnement réel, vous épargnez le temps nécessaire à la création de ce rôle à chaque charge.
En ce qui concerne les meilleures pratiques, exécutez une fois, si dans un plugin, vous devez utiliser register_activation_hook
et pour toute autre chose, j'utilise une fonction conditionnelle faite sur mesure et simple:
function run_once($key){
$test_case = get_option('run_once');
if (isset($test_case[$key]) && $test_case[$key]){
return false;
}else{
$test_case[$key] = true;
update_option('run_once',$test_case);
return true;
}
}
**usage:**
if (run_once('add_user_role')){
//do you stuff and it will only run once
}