Si una función requiere add_action('init') ¿cómo puedo ejecutarla solo una vez durante la activación del plugin?
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');
}

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

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

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


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 :-/

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.

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.
