Cum să rulezi o funcție care necesită add_action('init') o singură dată la activarea plugin-ului?
Folosesc wp_insert_term() pentru a introduce un număr mare de termeni de taxonomie dintr-un fișier CSV. Conținutul acelui fișier CSV se poate modifica ocazional. Conform codex-ului, wp_insert_term() trebuie să ruleze pe add_action('init'), dar eu vreau să-l rulez o singură dată. Cum pot realiza acest lucru la activarea plugin-ului?
În prezent fac asta în constructorul plugin-ului meu, care rulează la fiecare încărcare de pagină:
add_action('init', array($this, 'add_geo_terms'));
și apoi
public function add_geo_terms() {
// Calea către fișierul CSV
$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);
}
}
Folosesc funcțiile de activare oferite de wordpress plugin boilerplate, așa că nu cred că aceasta este o întrebare duplicat.
register_activation_hook( __FILE__, array( 'WPS_RESELLER', 'activate' ) );
public static function activate( $network_wide ) {
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
if ( $network_wide ) {
// Obține toate ID-urile de bloguri
$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'); // am încercat mai multe variații cu numele clasei, self etc
add_action('init', 'add_geo_terms');
}

Sunt conștient de acest lucru, dar când am adăugat funcția wp_insert_term() în interiorul unui hook de activare, aceasta nu a rulat.

Conectează apelul tău add_action()
într-un callback, care la rândul său este conectat la hook-ul de activare al Plugin-ului.

Rulezi mai întâi hook-ul de activare? Înaintea tuturor celorlalte hook-uri, inclusiv hook-ul init? (Chip 'da man!)


Folosesc WordPress Plugin Boilerplate, așa că funcția mea single_activate este statică. Tot nu reușesc să rulez asta la activare :-/

Codex-ul greșește. Sau mai bine zis, greșea. Funcția wp_insert_term poate fi rulată în orice moment oportun.
Nu ar trebui să o executați înainte de init, dar nu este neapărat necesar să o rulați la init.
Rețineți, codex-ul este un wiki. Oamenii îl pot edita liber. Nu toți vor avea întotdeauna dreptate.
Editare: În ceea ce privește motivul pentru care codul din întrebarea ta nu funcționează: Acțiunea "init" nu rulează în timpul procesului de activare. Așadar, adăugarea acelor două acțiuni nu va face nimic. În schimb, puteți pune inserarea termenului direct în acea funcție single_activate și va funcționa corect. Totuși, asigurați-vă că verificați mai întâi dacă termenul pe care doriți să-l inserați există deja. Oamenii pot activa, dezactiva și reactiva plugin-ul.

Nu cred că este nevoie să adăugați elementele la hook-ul init din funcția de activare. Cred că le puteți apela direct:
private static function single_activate() {
self::add_partner_terms(); //$this->add_partner_terms();
self::add_geo_terms(); //$this->add_geo_terms();
}
Nu sunt sigur dacă ar trebui să fie self::
sau $this->
pentru că sunt puțin confuz în legătură cu OOP, mai ales în seara asta.
