Обновления WordPress, плагинов и тем — важный элемент поддержания безопасности и функциональности сайта. Однако иногда после обновления возникают ошибки, которые могут привести к неправильной работе сайта или даже полной недоступности. В этой статье разберём, как сделать автоматический rollback обновлений WordPress при ошибках — то есть откат к предыдущей стабильной версии без ручного вмешательства.
Почему нужен автоматический rollback обновлений WordPress
Обновления — это всегда риск. Даже если тестировать изменения на локальной копии сайта, в продакшене могут появиться конфликты с другими плагинами, темами или серверным окружением. В результате:
- Сайт может перестать отображаться корректно.
- Могут возникнуть фатальные ошибки PHP.
- Некоторые функции перестанут работать.
Автоматический откат позволяет быстро вернуть рабочую версию без необходимости вмешательства администратора, что особенно актуально для сайтов с большим трафиком или без постоянного технического сопровождения.
Основные методы реализации автоматического rollback
1. Использование плагинов с функцией отката
Существует несколько плагинов, которые частично решают задачу:
- Clearfy Pro — плагин с широким функционалом оптимизации и защиты, в том числе с возможностью управления обновлениями и откатом.
- WP Rollback — позволяет вручную откатывать версии плагинов и тем, но автоматизации нет.
Однако для полностью автоматического отката потребуется собственная реализация.
2. Программный подход с использованием хуков обновлений
WordPress предоставляет хуки, которые можно использовать для отслеживания процесса обновления. Основная идея — после обновления проверить работу сайта (на уровне кода или через HTTP-запрос), и если обнаружена ошибка, вернуть предыдущую версию.
Для этого нужно:
- Перед обновлением сохранить текущую версию плагина/темы/ядра в отдельной папке (резервная копия).
- Запустить обновление.
- Проверить состояние сайта или ключевых функций.
- Если ошибка обнаружена — восстановить из резервной копии.
Пример реализации автоматического rollback для плагинов
Ниже приведён упрощённый пример функции, которая сохраняет резервную копию плагина перед обновлением и восстанавливает её, если после обновления сайт возвращает HTTP-код ошибки 500.
function wpbook_backup_plugin_before_update( $plugin ) {
$plugin_dir = WP_PLUGIN_DIR . '/' . dirname( $plugin );
$backup_dir = WP_CONTENT_DIR . '/backup_plugins/' . dirname( $plugin );
if ( ! file_exists( $backup_dir ) ) {
mkdir( $backup_dir, 0755, true );
}
// Копируем папку плагина в backup
wpbook_copy_dir( $plugin_dir, $backup_dir );
}
function wpbook_restore_plugin_after_failed_update( $plugin ) {
// Проверяем сайт на ошибки
$response = wp_remote_get( home_url() );
if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) >= 500 ) {
$backup_dir = WP_CONTENT_DIR . '/backup_plugins/' . dirname( $plugin );
$plugin_dir = WP_PLUGIN_DIR . '/' . dirname( $plugin );
// Восстанавливаем папку плагина из backup
wpbook_copy_dir( $backup_dir, $plugin_dir );
}
}
function wpbook_copy_dir( $src, $dst ) {
$dir = opendir( $src );
@mkdir( $dst );
while( false !== ( $file = readdir( $dir ) ) ) {
if ( ( $file != '.' ) && ( $file != '..' ) ) {
if ( is_dir( $src . '/' . $file ) ) {
wpbook_copy_dir( $src . '/' . $file, $dst . '/' . $file );
} else {
copy( $src . '/' . $file, $dst . '/' . $file );
}
}
}
closedir( $dir );
}
add_action( 'upgrader_pre_install', function( $true, $hook_extra ) {
if ( isset( $hook_extra['plugin'] ) ) {
wpbook_backup_plugin_before_update( $hook_extra['plugin'] );
}
return $true;
}, 10, 2 );
add_action( 'upgrader_process_complete', function( $upgrader_object, $options ) {
if ( $options['action'] == 'update' && $options['type'] == 'plugin' ) {
foreach( $options['plugins'] as $plugin ) {
wpbook_restore_plugin_after_failed_update( $plugin );
}
}
}, 10, 2 );Этот код создаёт локальные резервные копии плагинов перед обновлением и проверяет сайт после обновления. Если найден сбой, происходит восстановление из резервной копии.
Особенности и рекомендации
Проверка работоспособности сайта после обновления
В примере выше проверка — простой HTTP-запрос на главную страницу. На практике лучше проводить более тонкие проверки: запросить критичные страницы, выполнить тестовые запросы к API, проверить логи ошибок.
Хранение резервных копий
Резервные копии занимают место, поэтому стоит ограничить их количество и период хранения. Можно реализовать очистку старых бэкапов по расписанию.
Совместимость с различными типами обновлений
Аналогичный подход можно применить для тем и ядра WordPress, но нужно учитывать особенности путей и процесса обновления.
Инструменты для упрощения задачи
Если хочется сократить время разработки, можно использовать готовые решения и сервисы:
- Clearfy Pro — плагин с расширенными возможностями по контролю обновлений и безопасности, который может помочь автоматизировать откаты.
- Плагины для автоматического создания резервных копий, такие как UpdraftPlus или BackWPup, которые можно комбинировать с кастомной логикой.
Заключение
Автоматический rollback обновлений — полезная функция для обеспечения стабильности WordPress-сайта. Реализовать её можно как с помощью готовых плагинов, так и программно, используя хуки обновления. Важно тщательно тестировать механизм и адаптировать под специфику конкретного проекта, чтобы минимизировать простой сайта и потери данных.