Se una funzione richiede add_action('init') come posso eseguirla solo una volta all'attivazione del plugin?
Sto utilizzando wp_insert_term() per inserire un gran numero di termini di tassonomia da un file csv. Il contenuto di quel file csv potrebbe cambiare occasionalmente. Secondo il codex, wp_insert_term() deve essere eseguito su add_action('init') ma vorrei eseguirlo solo una volta. Come posso ottenere questo risultato all'attivazione del plugin?
Attualmente sto facendo questo nel costruttore del mio plugin che viene eseguito ad ogni caricamento di pagina:
add_action('init', array($this, 'add_geo_terms'));
e poi
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);
}
}
Sto utilizzando le funzioni di attivazione fornite dal wordpress plugin boilerplate quindi non credo che questa sia davvero una domanda duplicata.
register_activation_hook( __FILE__, array( 'WPS_RESELLER', 'activate' ) );
public static function activate( $network_wide ) {
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
if ( $network_wide ) {
// Ottieni tutti gli ID dei blog
$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'); // ho provato molte varianti con nome classe, self ecc
add_action('init', 'add_geo_terms');
}

Ne sono consapevole, ma quando ho aggiunto la funzione wp_insert_term() all'interno di un hook di attivazione, non è stata eseguita.

Collega la tua chiamata add_action()
a una callback, a sua volta agganciata all'hook di attivazione del Plugin.

Stai eseguendo l'hook di attivazione per primo? Prima di tutti gli altri hook incluso l'hook init? (Chip 'da man!)


Sto utilizzando il boilerplate del plugin wordpress quindi la mia single_activate è una funzione statica. Ancora non riesco a farlo eseguire all'attivazione :-/

Il codex è sbagliato. O meglio, lo era. wp_insert_term può essere eseguito in qualsiasi momento opportuno.
Non dovresti eseguirlo prima di init, ma non c'è una particolare necessità di eseguirlo durante init.
Ricorda, il codex è un wiki. Le persone possono modificarlo liberamente. Non tutti saranno accurati al 100% ogni volta.
Modifica: Per quanto riguarda il motivo per cui il tuo codice nella domanda non funziona: L'azione "init" non viene eseguita durante il processo di attivazione. Quindi aggiungere quelle due azioni non farà nulla. Puoi invece inserire direttamente il termine nella funzione single_activate e andrà bene. Tuttavia, assicurati di verificare prima se il termine che vuoi inserire esiste già o meno. Le persone possono attivare, disattivare e riattivare il plugin.

Non credo ci sia bisogno di aggiungere gli elementi all'hook init dalla funzione di attivazione. Penso che possano essere chiamati direttamente:
private static function single_activate() {
self::add_partner_terms(); //$this->add_partner_terms();
self::add_geo_terms(); //$this->add_geo_terms();
}
Non sono completamente sicuro se dovrebbe essere self::
o $this->
perché sono un po' confuso riguardo alla OOP, specialmente stasera.
