Desde WordPress 3.9 puedes usar upgrader_process_complete
hook.
Ver referencia 1 , 2
Aquí hay un código de ejemplo:
<?php
/**
* Plugin Name: Test plugin 1
* Plugin URI: http://rundiz.com
* Description: A very simple plugin for testing. This plugin do nothing.
* Version: 0.1.8
* Author: Vee Winch
* Author URI: http://rundiz.com
* License: MIT
* License URI: https://opensource.org/licenses/MIT
* Text Domain: test-plugin1
* Domain Path:
*/
$wppstp1_version = '0.1.8';
add_action('upgrader_process_complete', 'wppstp1_upgrade', 10, 2);// will working only this plugin activated.
function wppstp1_upgrade(\WP_Upgrader $upgrader_object, $hook_extra)
{
global $wppstp1_version;
if (is_array($hook_extra) && array_key_exists('action', $hook_extra) && array_key_exists('type', $hook_extra) && array_key_exists('plugins', $hook_extra)) {
// check first that array contain required keys to prevent undefined index error.
if ($hook_extra['action'] == 'update' && $hook_extra['type'] == 'plugin' && is_array($hook_extra['plugins']) && !empty($hook_extra['plugins'])) {
// if this action is update plugin.
$this_plugin = plugin_basename(__FILE__);
foreach ($hook_extra['plugins'] as $each_plugin) {
if ($each_plugin == $this_plugin) {
// if this plugin is in the updated plugins.
// don't process anything from new version of code here, because it will work on old version of the plugin.
file_put_contents(WP_CONTENT_DIR . '/test.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND); // you will always get the previous version even you update to the new version.
// set transient to let it run later.
set_transient('wppstp1_updated', 1);
}
}// endforeach;
unset($each_plugin);
}// endif update plugin and plugins not empty.
}// endif; $hook_extra
}// wppstp1_upgrade
add_action('plugins_loaded', 'wppstp1_runUpdatedPlugin');
function wppstp1_runUpdatedPlugin()
{
global $wppstp1_version;
if (get_transient('wppstp1_updated') && current_user_can('manage_options')) {
// if plugin updated and current user is admin.
file_put_contents(WP_CONTENT_DIR . '/test-update-by-transient.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND);// you will always get the updated version here.
// update code here.
// delete transient.
delete_transient('wppstp1_updated');
}
}// wppstp1_runUpdatedPlugin
Una vez actualizado el complemento, configurará la tarea en db usando la set_transient()
función. No se recomienda agregar un código de actualización al llamar a upgrader_process_complete
hook.
A continuación, si navega a otra página de administración, el plugins_loaded
enlace funcionará y el código de actualización funcionará allí.
Tenga en cuenta que este complemento debe estar activado para que funcione el enlace de actualización.
Esto no funciona en el complemento de activación, por lo tanto, si desea que el código que funciona active el complemento, debe codificarlo en register_activation_hook()
función.