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');
}
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.
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?
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.