WordPress как на ладони
wordpress jino

Как обновить данные плагина во время автоматического обновления плагина

Столкнулся с необходимостью обновить данные плагина при его обновлении. В новой версии изменяется струкрута таблицы базы данных и хотелось бы, чтобы при обновлении пользователи не видели что под капотом и просто обновили плагин, а все необходимые действия он сделал автоматически.

Разумеется нужно, чтобы нужные мне действия выполнялись один раз, во время обновления.

Нужно что-то вроде register_activation_hook().

2
Гость 3.2 года назад
  • 0
    Kama4697

    Плагин при авто-обновлении сам себя деактивирует и активирует, правда не всегда (в каких случаях это происходит точно не знаю)...

    Другой вариант: вам нужен хук 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 .............
    			}
    		}
    	}
    }

    Реальный пример на основе тестов

    // $options содержит такой массив
    Array
    (
    	[action] => update
    	[type] => plugin
    	[bulk] => 1
    	[plugins] => Array
    		(
    			[0] => __autoupdate_second_test/index.php
    		)
    
    )
    // $upgrader_object  содержит такой массив
    
    Plugin_Upgrader Object
    (
    	[result] => Array
    		(
    			[source] => C:/sites/wptest.ru/www/wp-content/upgrade/autoupdate_second_test-OAfGR3/__autoupdate_second_test/
    			[source_files] => Array
    				(
    					[0] => index.php
    					[1] => readme.txt
    				)
    
    			[destination] => C:/sites/wptest.ru/www/wp-content/plugins/__autoupdate_second_test/
    			[destination_name] => __autoupdate_second_test
    			[local_destination] => C:/sites/wptest.ru/www/wp-content/plugins
    			[remote_destination] => C:/sites/wptest.ru/www/wp-content/plugins/__autoupdate_second_test/
    			[clear_destination] => 1
    		)
    
    	[bulk] => 1
    	[strings] => Array
    		(
    			[bad_request] => Предоставлены неверные данные.
    			[fs_unavailable] => Нет доступа к файловой системе.
    			[fs_error] => Ошибка файловой системы.
    			[fs_no_root_dir] => Не удалось определить корневую директорию WordPress.
    			[fs_no_content_dir] => Не удалось определить директорию содержимого WordPress (wp-content).
    			[fs_no_plugins_dir] => Не удалось определить директорию плагинов WordPress.
    			[fs_no_themes_dir] => Не удалось определить директорию тем WordPress.
    			[fs_no_folder] => Не удалось определить требуемую директорию (%s).
    			[download_failed] => Загрузка не удалась.
    			[installing_package] => Установка свежей версии…
    			[no_files] => Архив не содержит файлов.
    			[folder_exists] => Каталог назначения уже существует.
    			[mkdir_failed] => Не удалось создать директорию.
    			[incompatible_archive] => Архив не удалось установить.
    			[files_not_writable] => Обновление не может быть установлено, потому что нам не удастся скопировать некоторые файлы. Обычно это связано с неверными правами на файлы.
    			[maintenance_start] => Включение режима обслуживания…
    			[maintenance_end] => Отключение режима обслуживания…
    			[up_to_date] => Используется свежая версия плагина.
    			[no_package] => Архив обновления недоступен.
    			[downloading_package] => Загрузка обновления с <span class="code">%s</span>…
    			[unpack_package] => Извлечение обновления…
    			[remove_old] => Удаление старой версии плагина…
    			[remove_old_failed] => Не удалось удалить старый плагин.
    			[process_failed] => Обновление плагина не удалось.
    			[process_success] => Плагин успешно обновлён.
    			[process_bulk_success] => Плагины успешно обновлены.
    		)
    
    	[skin] => WP_Ajax_Upgrader_Skin Object
    		(
    			[errors:protected] => WP_Error Object
    				(
    					[errors] => Array
    						(
    						)
    
    					[error_data] => Array
    						(
    						)
    
    				)
    
    			[messages:protected] => Array
    				(
    					[0] => Включение режима обслуживания…
    					[1] => Загрузка обновления с http://api.wp-kama.ru/plugin_updates/plugins/__autoupdate_second_test/tags/__autoupdate_second_test.zip?7392…
    					[2] => Извлечение обновления…
    					[3] => Установка свежей версии…
    					[4] => Удаление старой версии плагина…
    					[5] => Плагин успешно обновлён.
    					[6] => Отключение режима обслуживания…
    				)
    
    			[upgrader] => Plugin_Upgrader Object
     *RECURSION*
    			[done_header] => 
    			[done_footer] => 
    			[result] => Array
    				(
    					[source] => C:/sites/wptest.ru/www/wp-content/upgrade/autoupdate_second_test-OAfGR3/__autoupdate_second_test/
    					[source_files] => Array
    						(
    							[0] => index.php
    							[1] => readme.txt
    						)
    
    					[destination] => C:/sites/wptest.ru/www/wp-content/plugins/__autoupdate_second_test/
    					[destination_name] => __autoupdate_second_test
    					[local_destination] => C:/sites/wptest.ru/www/wp-content/plugins
    					[remote_destination] => C:/sites/wptest.ru/www/wp-content/plugins/__autoupdate_second_test/
    					[clear_destination] => 1
    				)
    
    			[options] => Array
    				(
    					[url] => 
    					[nonce] => 
    					[title] => 
    					[context] => C:/sites/wptest.ru/www/wp-content
    				)
    
    			[plugin_info] => Array
    				(
    					[Name] => Тестовый плагин автообновления
    					[PluginURI] => http://site.ru/foo
    					[Version] => 1.0
    					[Description] => Краткое описание плагина.
    					[Author] => Kama
    					[AuthorURI] => http://site.ru
    					[TextDomain] => __autoupdate_second_test
    					[DomainPath] => 
    					[Network] => 
    					[Title] => Тестовый плагин автообновления
    					[AuthorName] => Kama
    				)
    
    			[plugin_active] => 1
    		)
    
    	[update_count] => 1
    	[update_current] => 1
    )

    Очень важно, что этот хук должен быть в плагине который удаляется, а не в новом который обновляется... И это надо сказать проблема...

    Нашел здесь и здесь.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.