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, l'une d'abord 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 avez bien compris, vous ne devriez jamais avoir à exécuter ce code encore.
Donc, généralement, j'ai mis mon add_role () dans un crochet 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 majuscules, cela prendra effectivement effet.
Mais il est clair que cela est désormais 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 je pourrais créer une page de plugin sous Utilisateurs ou Outils, où ce rôle peut être créé une fois. Je suppose que j'espère qu'il existe une solution plus simple et plus élégante.
Je n'imagine pas qu'il y a une sorte d'action run_once, n'est-ce pas?
Ou la meilleure pratique consiste-t-elle simplement à ajouter le rôle, puis à utiliser add_cap () plusieurs fois? Et même alors, j'imagine que add_cap accède à la base de données.
Je pense simplement à la meilleure façon de réduire l'accès inutile aux bases de données. Quelles sont vos bonnes pratiques?
la source
remove_role()
fonction avantadd_role()
m'a aidé.Réponses:
Les rôles et les capacités des utilisateurs sont enregistrés dans la base de données, donc une fois que vous les avez utilisés, ils sont
add_role()
enregistrés puis chargés à la prochaine WordPress connaîtra ce rôle, 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 uniquement le rôle et les capacités dans la base de données si la var$use_db
est définie sur true (ce qu'il est par défaut) afin que vous puissiez simplement la changer avant d'appeler votreadd_role()
et le rôle ne sera pas enregistré.essayer:
Mise à jour:
Si c'est dans un environnement de test / développement, je ne vois aucun inconvénient, mais si vous êtes dans un environnement en direct, vous économisez le temps nécessaire pour créer ce rôle à chaque chargement.
En ce qui concerne les meilleures pratiques exécutées une fois, si dans un plugin vous devez utiliser
register_activation_hook
et pour toute autre chose j'utilise une simple fonction conditionnelle personnalisée:la source
run_once
augmente trop d'opérations de lecture / écriture de base de données à chaque chargement de page. Veuillez ne pas l'utiliser.