Wenn eine function add_action (‘init’) benötigt, wie kann ich sie nur einmal bei der Aktivierung des Plugins ausführen?

Ich verwende wp_insert_term (), um eine große Anzahl von Taxonomie-Begriffen aus einer CSV-Datei einzufügen. Der Inhalt dieser CSV-Datei kann sich gelegentlich ändern. Laut dem Codex muss wp_insert_term () auf add_action (‘init’) laufen, aber ich möchte es nur einmal ausführen. Wie kann ich das bei der Plugin-Aktivierung erreichen?

Ich mache das gerade im Konstruktor meines Plugins, der bei jedem Laden der Seite ausgeführt wird:

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

und dann

 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] . "
\n"); wp_insert_term($data[$c],'reseller-regions'); } } } fclose($handle); } }

Ich benutze die Aktivierungsfunktionen, die vom WordPress-Plugin zur Verfügung gestellt werden, also glaube ich nicht, dass es sich um ein Duplikat handelt.

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

Solutions Collecting From Web of "Wenn eine function add_action (‘init’) benötigt, wie kann ich sie nur einmal bei der Aktivierung des Plugins ausführen?"

Ich denke nicht, dass es notwendig ist, die Elemente zu dem Init-Hook von der Aktivierungsfunktion hinzuzufügen. Ich denke, Sie können sie direkt anrufen:

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

Ich bin mir nicht wirklich sicher, ob es sich um mich selbst handeln sollte oder $this-> weil ich ein wenig verschwommen über OOP bin, besonders heute Nacht.

Das register_activation_hook() nur ausgeführt, wenn das Plugin aktiviert ist.

Vielleicht ist das der Haken, den Sie bevorzugen würden?

Der Codex ist falsch. Oder eher, war falsch. wp_insert_term kann jederzeit ausgeführt werden.

Sie sollten es nicht vor init ausführen, aber es ist nicht notwendig, es bei init auszuführen.

Denken Sie daran, der Codex ist ein Wiki. Leute können es frei bearbeiten. Nicht alle werden jedes Mal 100% ig sein.

Bearbeiten: Wie für den Grund, dass Ihr Code in der Frage nicht funktioniert: Die Aktion “init” wird während des Aktivierungsprozesses nicht ausgeführt. Das Hinzufügen dieser beiden Aktionen wird also nichts bewirken. Sie können stattdessen den Insert-Begriff direkt in diese single_activate-function einfügen und es wird in Ordnung sein. Überprüfen Sie jedoch, ob der Begriff, den Sie einfügen möchten, zuerst existiert oder nicht. Benutzer können auch aktivieren, deaktivieren und erneut aktivieren.