Se una funzione richiede add_action('init') come posso eseguirla solo una volta all'attivazione del plugin?

23 ott 2013, 20:05:37
Visualizzazioni: 2.14K
Voti: 1

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');
}
0
Tutte le risposte alla domanda 3
7

La funzione <a href="http://codex.wordpress.org/Function_Reference/register_activation_hook" rel="noreferrer">register_activation_hook()</a> viene eseguita solo quando il plugin viene attivato.

Forse è questo l'hook che preferiresti utilizzare?

23 ott 2013 20:09:52
Commenti

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

codecowboy codecowboy
23 ott 2013 20:11:30

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

Chip Bennett Chip Bennett
23 ott 2013 20:17:29

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

josh josh
23 ott 2013 20:17:41

@ChipBennett stai supponendo che io sappia come farlo!

codecowboy codecowboy
24 ott 2013 13:52:12

In questo modo:

josh josh
24 ott 2013 19:16:25

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

codecowboy codecowboy
24 ott 2013 20:31:33

@josh. grazie. Questo è quello che ho provato ma quelle funzioni non vengono eseguite. Ho aggiornato la mia domanda con un link allo stile di attivazione che sto utilizzando

codecowboy codecowboy
24 ott 2013 20:35:05
Mostra i restanti 2 commenti
0

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.

25 ott 2013 00:35:05
1

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.

25 ott 2013 00:03:53
Commenti

Penso che tu abbia ragione! Non ho idea del perché non funzionasse per me prima, ma grazie. È self perché non c'è $this all'interno di una funzione statica.

codecowboy codecowboy
25 ott 2013 00:28:03