Si una función requiere add_action('init') ¿cómo puedo ejecutarla solo una vez durante la activación del plugin?

23 oct 2013, 20:05:37
Vistas: 2.14K
Votos: 1

Estoy usando wp_insert_term() para insertar una gran cantidad de términos de taxonomía desde un archivo CSV. El contenido de ese archivo CSV podría cambiar ocasionalmente. Según el codex, wp_insert_term() necesita ejecutarse en add_action('init') pero solo quiero ejecutarlo una vez. ¿Cómo puedo lograr esto durante la activación del plugin?

Actualmente solo estoy haciendo esto en el constructor de mi plugin que se ejecuta en cada carga de página:

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

y luego

public function add_geo_terms() {
    // Ruta al archivo CSV con los condados del Reino Unido
    $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);
    }
}

Estoy usando las funciones de activación proporcionadas por el wordpress plugin boilerplate así que no creo que esto sea realmente un duplicado.

register_activation_hook( __FILE__, array( 'WPS_RESELLER', 'activate' ) );


public static function activate( $network_wide ) {
        if ( function_exists( 'is_multisite' ) && is_multisite() ) {
            if ( $network_wide  ) {
                // Obtener todos los IDs de blogs
                $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'); // he probado muchas variaciones con nombre de clase, self etc
    add_action('init', 'add_geo_terms');
}
0
Todas las respuestas a la pregunta 3
7

El <a href="http://codex.wordpress.org/Function_Reference/register_activation_hook" rel="noreferrer">register_activation_hook()</a> solo se ejecuta cuando el plugin se activa.

¿Quizás ese sea el hook que prefieras usar?

23 oct 2013 20:09:52
Comentarios

Soy consciente de esto pero cuando añadí la función wp_insert_term() dentro de un hook de activación, no se ejecutó.

codecowboy codecowboy
23 oct 2013 20:11:30

Engancha tu llamada add_action() a un callback, que a su vez esté enganchado al hook de activación del Plugin.

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

¿Estás ejecutando primero el hook de activación? ¿Antes que todos los demás hooks incluyendo el hook init? (¡Chip 'da man!)

josh josh
23 oct 2013 20:17:41

@ChipBennett ¡estás asumiendo que sé cómo hacer eso!

codecowboy codecowboy
24 oct 2013 13:52:12

Así:

josh josh
24 oct 2013 19:16:25

Estoy usando el boilerplate de plugins de WordPress, así que mi single_activate es una función estática. Aún no logro que esto se ejecute en la activación :-/

codecowboy codecowboy
24 oct 2013 20:31:33

@josh. gracias. Eso es lo que he intentado pero esas funciones no se ejecutan. He actualizado mi pregunta con un enlace al estilo de activación que estoy usando

codecowboy codecowboy
24 oct 2013 20:35:05
Mostrar los 2 comentarios restantes
0

El codex estaba equivocado. O más bien, lo estuvo. wp_insert_term se puede ejecutar en cualquier momento oportuno.

No deberías ejecutarlo antes de init, pero no hay una necesidad particular de ejecutarlo en init.

Recuerda, el codex es un wiki. La gente puede editarlo libremente. No todos van a estar 100% correctos todo el tiempo.

Edición: En cuanto a la razón por la que tu código en la pregunta no funciona: La acción "init" no se ejecuta durante el proceso de activación. Así que agregar esas dos acciones no hará nada. En su lugar, puedes poner el insert term directamente en esa función single_activate y estará bien. Sin embargo, asegúrate de verificar primero si el término que deseas insertar existe o no. La gente puede activar, desactivar y reactivar también.

25 oct 2013 00:35:05
1

No creo que sea necesario agregar los elementos al hook init desde la función de activación. Pienso que puedes llamarlos directamente:

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

No estoy completamente seguro si debería ser self:: o $this-> porque estoy un poco confundido con la POO, especialmente esta noche.

25 oct 2013 00:03:53
Comentarios

¡Creo que tienes razón! No tengo idea de por qué esto no funcionaba para mí antes, pero gracias. Es self porque no hay $this dentro de una función estática.

codecowboy codecowboy
25 oct 2013 00:28:03