Как обновить данные плагина во время автоматического обновления плагина
Столкнулся с необходимостью обновить данные плагина при его обновлении. В новой версии изменяется струкрута таблицы базы данных и хотелось бы, чтобы при обновлении пользователи не видели что под капотом и просто обновили плагин, а все необходимые действия он сделал автоматически.
Разумеется нужно, чтобы нужные мне действия выполнялись один раз, во время обновления.
Нужно что-то вроде register_activation_hook().
Плагин при авто-обновлении сам себя деактивирует и активирует, правда не всегда (в каких случаях это происходит точно не знаю)...
Другой вариант: вам нужен хук
upgrader_process_complete. Хук расположен в файле /wp-admin/includes/class-plugin-upgrader.php:/** * Fires when the upgrader process is complete. * * See also {@see 'upgrader_package_options'}. * * @since 3.6.0 * @since 3.7.0 Added to WP_Upgrader::run(). * @since 4.6.0 `$translations` was added as a possible argument to `$hook_extra`. * * @param WP_Upgrader $this WP_Upgrader instance. In other contexts, $this, might be a * Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader instance. * @param array $hook_extra { * Array of bulk item update data. * * @type string $action Type of action. Default 'update'. * @type string $type Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'. * @type bool $bulk Whether the update process is a bulk update. Default true. * @type array $plugins Array of the basename paths of the plugins' main files. * @type array $themes The theme slugs. * @type array $translations { * Array of translations update data. * * @type string $language The locale the translation is for. * @type string $type Type of translation. Accepts 'plugin', 'theme', or 'core'. * @type string $slug Text domain the translation is for. The slug of a theme/plugin or * 'default' for core translations. * @type string $version The version of a theme, plugin, or core. * } * } */ do_action( 'upgrader_process_complete', $this, array( 'action' => 'update', 'type' => 'plugin', 'bulk' => true, 'plugins' => $plugins, ) );Как видно во втором параметре можно определить что было обновлено, тема, ядро или плагин. Какой именно плагин был обновлен видимо можно выявить через передаваемую переменную $plugins. В общем, код какой-то такой:
add_action('upgrader_process_complete', 'my_plugin_update', 10, 2); function my_plugin_update( $this, $array ){ if( $options['action'] != 'update' || $options['type'] != 'plugin' ) return; // if( $array['plugins'] ) дополнительная проверка, точно не знаю как тут проверять. // делаем что нужно после обновления плагина }Еще пример из кодекса:
// Функция не тестировалась add_action( 'upgrader_process_complete', 'my_upgrate_function', 10, 2); function my_upgrate_function( $upgrader_object, $options ) { if( $options['action'] == 'update' && $options['type'] == 'plugin' ){ $current_plugin_path_name = plugin_basename( __FILE__ ); foreach( $options['plugins'] as $each_plugin ){ if( $each_plugin == $current_plugin_path_name ){ // .......................... YOUR CODES ............. } } } }Реальный пример на основе тестов
Очень важно, что этот хук должен быть в плагине который удаляется, а не в новом который обновляется... И это надо сказать проблема...
Нашел здесь и здесь.