¿Hay alguna forma de probar si una función que se ejecuta solo en la actualización del complemento se está ejecutando correctamente?
Sí.
Fondo
Cuando actualizas un complemento, WordPress realiza varias acciones detrás de escena.
- Descargue la nueva versión del complemento
- Desactivar la versión anterior del complemento
- Eliminar la versión anterior del complemento
- Extraer la nueva versión
- Activar la nueva versión
Además de los ganchos que WordPress dispara durante esas acciones, dispara upgrader_process_complete
. Este enlace pasa dos parámetros a la devolución de llamada: $this
, que obviamente es la instancia del objeto, y $options['hook_extra']
, que son argumentos adicionales que se pasan a los enlaces de filtro llamados por WP_Upgrader::install_package()
. La clase Plugin_Upgrader
pasa la siguiente matriz:
array( 'plugin' => $plugin,
'type' => 'plugin',
'action' => 'update',
)
Gancho de actualización
Por lo tanto, si queremos ejecutar una función en una actualización de un complemento, podemos usar este enlace.
add_action( 'upgrader_process_complete', 'wpse_262412_upgrader_process_complete' );
function wpse_262412_upgrader_process_complete( $instance, $extras ) {
//* Only interesting when 'our' plugin updates
if(
'plugin' !== $extras[ 'type' ] &&
'update' !== $extras[ 'action' ] &&
'my-plugin-name' !== $extras[ 'plugin' ]
) {
return;
}
//* Do something useful after your plugin updates
wpse_262412_something_useful();
}
Comprobando
Si está desarrollando un complemento y desea que una función particular se ejecute en la actualización del complemento, puede agregar una opción a la base de datos:
function wpse_262412_something_useful() {
include_once( ABSPATH . '/wp-admin/includes/plugin.php' );
$data = get_plugin_data( 'my-plugin-name' );
update_option( 'my-plugin-update-option', $data[ 'version' ] );
}
Luego podemos agregar una acción a init que verifique el valor de esa opción. Si el valor de la opción es igual a la versión actual del complemento, entonces sabemos que la función se ha ejecutado. Luego podemos asegurarnos de que podamos ver que la función se ha ejecutado, como agregar un aviso de administrador.
add_action( 'init', 'wpse_262412_init' );
function wpse_262412_init() {
$data = get_plugin_data( 'my-plugin-name' );
$option = get_option( 'my-plugin-update-option' );
if( $data[ 'version' ] === $option ) {
//* The plugin update function ran successfully
add_action( 'admin_notices', 'wpse_262412_update_notice' );
}
}
function wpse_262412_update_notice() {
?>
<div class="updated notice">
<p><?php _e( 'The function has run correctly.', 'wpse-262412' ); ?></p>
</div>
<?php
}
¿Pero hay algún otro enfoque mejor?
¿Es esto mejor que tu enfoque? No lo sé. Depende de su aplicación. No implica abrir y leer un archivo de configuración, por lo que probablemente será más rápido. Pero probablemente no notablemente mucho. Yo no haría ningún método en un sitio de producción. Asegúrese de que su código funcione en un servidor de desarrollo, luego utilícelo. Si estás hablando de comparar los números de versión de los complementos, me parece que es una buena forma de hacerlo.