Cum să rulezi o funcție care necesită add_action('init') o singură dată la activarea plugin-ului?

23 oct. 2013, 20:05:37
Vizualizări: 2.14K
Voturi: 1

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

}
0
Toate răspunsurile la întrebare 3
7

Funcția <a href="http://codex.wordpress.org/Function_Reference/register_activation_hook" rel="noreferrer">register_activation_hook()</a> este executată doar atunci când un plugin este activat.

Probabil acesta este hook-ul pe care l-ai prefera să îl folosești?

23 oct. 2013 20:09:52
Comentarii

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.

codecowboy codecowboy
23 oct. 2013 20:11:30

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.

Chip Bennett Chip Bennett
23 oct. 2013 20:17:29

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

josh josh
23 oct. 2013 20:17:41

@ChipBennett presupui că știu cum să fac asta!

codecowboy codecowboy
24 oct. 2013 13:52:12

Așa:

josh josh
24 oct. 2013 19:16:25

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

codecowboy codecowboy
24 oct. 2013 20:31:33

@josh. mulțumesc. Asta am încercat, dar acele funcții nu rulează. Am actualizat întrebarea mea cu un link către stilul de activare pe care îl folosesc

codecowboy codecowboy
24 oct. 2013 20:35:05
Arată celelalte 2 comentarii
0

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.

25 oct. 2013 00:35:05
1

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.

25 oct. 2013 00:03:53
Comentarii

Cred că ai dreptate! Nu am idee de ce nu funcționa pentru mine înainte, dar îți mulțumesc. Este self pentru că nu există $this în interiorul unei funcții statice.

codecowboy codecowboy
25 oct. 2013 00:28:03