add_role () exécuté une seule fois?

11

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 ceci est clairement exécuté à chaque fois qu’une page du blog est consultée. D'accord, je pourrais le placer 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’un type d’action run_once existe-t-il?

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 au meilleur moyen de réduire l’accès inutile à la base de données. Quelles sont vos meilleures pratiques?

    
posée Tom Auger 11.08.2011 - 15:30

1 réponse

8

Les rôles et fonctionnalités de l'utilisateur sont enregistrés dans la base de données. Ainsi, une fois que vous avez utilisé add_role() its sauvegardés, le prochain chargement WordPress le connaîtra, tout comme les rôles intégrés.

Maintenant, si vous regardez la fonction add_role() plus précisément à la ligne 141 , vous constaterez que le rôle et les fonctionnalités de la base de données ne sont sauvegardés que si var $use_db est défini sur true (valeur par défaut), de sorte que vous pouvez simplement le modifier avant d'appeler votre add_role() function et le rôle ne sera pas enregistré.

essayez:

//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 );

Mise à 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-les une fois. Si vous utilisez un plug-in, vous devez utiliser register_activation_hook . Pour toute autre chose, j’utilise une fonction conditionnelle faite sur mesure:

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
}
    
réponse donnée Bainternet 11.08.2011 - 19:20

Lire d'autres questions sur les étiquettes