web-dev-qa-db-fra.com

add_role () exécuté seulement une fois?

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?

12
Tom Auger

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
}
9
Bainternet