web-dev-qa-db-fra.com

Si une fonction nécessite add_action ('init'), comment puis-je l'exécuter une seule fois lors de l'activation du plug-in?

J'utilise wp_insert_term () pour insérer un grand nombre de termes de taxonomie à partir d'un fichier csv. Le contenu de ce fichier csv peut parfois changer. Selon le codex, wp_insert_term () doit être exécuté sur add_action ('init'), mais je ne souhaite l'exécuter qu'une seule fois. Comment puis-je atteindre cet objectif lors de l'activation d'un plugin?

Je ne fais actuellement que cela dans le constructeur de mon plugin qui s'exécute à chaque chargement de page:

   add_action('init', array($this, 'add_geo_terms'));

et alors

public function add_geo_terms() {


    $path = plugin_dir_path( __FILE__ ).'assets/uk-counties.csv';
    $row = 1;
    if (($handle = fopen($path, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $num = count($data);
            $row++;
            for ($c=0; $c < $num; $c++) {
                if ($c == 1) {
                    error_log( $data[$c] . "<br />\n");
                    wp_insert_term($data[$c],'reseller-regions');
                }
            }
        }
        fclose($handle);
    }
}

J'utilise les fonctions d'activation fournies par le plugin wordpress boilerplate , donc je ne crois pas qu'il s'agisse vraiment d'un doublon.

register_activation_hook( __FILE__, array( 'WPS_RESELLER', 'activate' ) );


public static function activate( $network_wide ) {
        if ( function_exists( 'is_multisite' ) && is_multisite() ) {
            if ( $network_wide  ) {
                // Get all blog ids
                $blog_ids = self::get_blog_ids();

                foreach ( $blog_ids as $blog_id ) {
                    switch_to_blog( $blog_id );
                    self::single_activate();
                }
                restore_current_blog();
            } else {
                self::single_activate();
            }
        } else {
            self::single_activate();
        }
    }

private static function single_activate() {
    add_action('init', 'add_partner_terms'); // i have tried many variations with classname, self etc
    add_action('init', 'add_geo_terms');

}
1
codecowboy

Je ne pense pas qu'il soit nécessaire d'ajouter les éléments au hook d'initialisation à partir de la fonction d'activation. Je pense que vous pouvez les appeler directement:

private static function single_activate() {
    self::add_partner_terms(); //$this->add_partner_terms();
    self::add_geo_terms();  //$this->add_geo_terms();
}

Je ne sais pas vraiment si cela devrait être self:: ou $this-> car je suis un peu confus à propos de la programmation orientée objet, particulièrement ce soir.

1
helgatheviking

La register_activation_hook() n'est exécutée que lorsque le plugin est activé.

C'est peut-être le crochet que vous préféreriez utiliser?

5
josh

Le codex se trompe. Ou plutôt, s'est trompé. wp_insert_term peut être exécuté à tout moment.

Vous ne devriez pas l'exécuter avant init, mais il n'est pas particulièrement nécessaire de l'exécuter sur init.

Rappelez-vous que le codex est un wiki. Les gens peuvent l'éditer librement. Tous ne seront pas à 100% à chaque fois.

Edit: En ce qui concerne la raison pour laquelle votre code dans la question ne fonctionne pas: L'action "init" ne s'exécute pas pendant le processus d'activation. Donc, ajouter ces deux actions ne fera rien. Vous pouvez plutôt placer le terme d'insertion directement dans cette fonction single_activate et tout ira bien. Cependant, assurez-vous de vérifier si le terme que vous souhaitez insérer existe ou non en premier. Les gens peuvent aussi activer, désactiver et réactiver.

3
Otto