Обновление плагинов и тем — важная часть поддержки сайта на WordPress. Однако иногда после обновления появляются ошибки, которые могут привести к недоступности сайта или потере функционала. В этой статье мы разберём, как сделать автоматический откат обновлений в WordPress при возникновении ошибок, чтобы быстро вернуть сайт в рабочее состояние без вмешательства администратора.
Почему важен автоматический откат обновлений в WordPress
Обычно WordPress обновляет плагины и темы автоматически или по команде администратора. Если после обновления возникает ошибка — например, из-за несовместимости версии PHP, конфликтов с другими плагинами или багов в обновлённой версии — сайт может перестать работать.
Ручной откат требует времени и доступа к хостингу — нужно зайти по FTP, заменить файлы, откатить базу данных. Автоматический откат позволяет оперативно восстановить работоспособность без потери данных и простоев.
Реализовать автоматический откат можно как с помощью плагинов, так и собственными средствами — через хуки WordPress и пользовательский код.
Обзор плагинов для автоматического отката обновлений
1. WP Rollback
Плагин WP Rollback позволяет вручную откатить обновления плагинов и тем к предыдущим версиям через админку. Он не автоматизирует процесс, но облегчает ручной откат.
2. Easy Updates Manager
Easy Updates Manager помогает гибко настраивать автоматические обновления и уведомления. В сочетании с мониторингом ошибок можно настроить частичный откат вручную.
3. WP Downgrade
Плагин WP Downgrade позволяет переключаться на выбранные версии WordPress, тем и плагинов, что полезно при необходимости отката.
Однако полностью автоматического отката с этими плагинами нет — их нужно использовать в комплексе с мониторингом и пользовательским кодом.
Как реализовать автоматический откат обновлений с помощью кода
В WordPress есть хук upgrader_process_complete, который срабатывает после завершения обновления плагина или темы. Мы можем использовать его, чтобы проверить, возникли ли ошибки, и при необходимости откатить обновление.
Пример функции для автоматического отката обновления плагина при ошибке:
function wordpressa_rollback_on_update_error($upgrader_object, $options) {
// Проверяем, что это обновление плагина
if ($options['action'] === 'update' && $options['type'] === 'plugin') {
$plugin = $options['plugins'][0]; // обновляемый плагин
// Здесь добавьте проверку ошибок, например, доступность сайта, логи и т.п.
$site_works = wordpressa_check_site_health();
if (!$site_works) {
// Если сайт не работает — откатываем плагин
wordpressa_rollback_plugin($plugin);
}
}
}
add_action('upgrader_process_complete', 'wordpressa_rollback_on_update_error', 10, 2);Функция проверки работоспособности сайта
Эта функция должна возвращать true, если сайт работает нормально, и false при ошибках. Для примера можно сделать простой HTTP-запрос к главной странице:
function wordpressa_check_site_health() {
$response = wp_remote_get(home_url());
if (is_wp_error($response)) {
return false;
}
$code = wp_remote_retrieve_response_code($response);
return ($code >= 200 && $code < 400);
}Функция отката плагина
Для отката можно скачать предыдущую версию плагина из репозитория WordPress и заменить файлы, либо использовать WP-CLI через PHP (если есть доступ). Ниже пример упрощённой функции:
function wordpressa_rollback_plugin($plugin_file) {
// Путь к каталогу плагина
$plugin_dir = WP_PLUGIN_DIR . '/' . dirname($plugin_file);
// URL предыдущей версии плагина в репозитории (пример, нужно заменить на реальный)
$rollback_url = 'https://downloads.wordpress.org/plugin/' . basename($plugin_dir) . '.zip';
// Скачиваем архив
$tmp_file = download_url($rollback_url);
if (is_wp_error($tmp_file)) {
error_log('Rollback: ошибка скачивания архива');
return false;
}
// Распаковываем архив
$result = unzip_file($tmp_file, WP_PLUGIN_DIR);
@unlink($tmp_file);
if (is_wp_error($result)) {
error_log('Rollback: ошибка распаковки архива');
return false;
}
// Можно добавить очистку кэша, деактивацию и повторную активацию плагина
error_log('Rollback: плагин откатан');
return true;
}Рекомендации по интеграции автоматического отката
1. Тестируйте обновления на staging-сервере, чтобы минимизировать риск ошибок на живом сайте.
2. Ведите логи обновлений и ошибок, чтобы отследить причины сбоев и быстро реагировать.
3. Используйте систему резервного копирования — откат обновления не всегда решает проблему, иногда нужно вернуть базу данных и файлы.
4. Комбинируйте автоматический откат с уведомлениями — администратор должен знать о проблемах и причинах отката.
Пример расширенного решения с уведомлением и логированием
Добавим уведомление по email и запись в лог при срабатывании отката:
function wordpressa_rollback_on_update_error($upgrader_object, $options) {
if ($options['action'] === 'update' && $options['type'] === 'plugin') {
$plugin = $options['plugins'][0];
$site_works = wordpressa_check_site_health();
if (!$site_works) {
$result = wordpressa_rollback_plugin($plugin);
if ($result) {
error_log('Rollback выполнен для плагина: ' . $plugin);
wp_mail(get_option('admin_email'), 'Откат обновления плагина', "Обновление плагина $plugin вызвало ошибку. Выполнен откат.");
} else {
error_log('Rollback не удалось для плагина: ' . $plugin);
wp_mail(get_option('admin_email'), 'Ошибка отката обновления плагина', "Не удалось откатить обновление плагина $plugin.");
}
}
}
}
add_action('upgrader_process_complete', 'wordpressa_rollback_on_update_error', 10, 2);Выводы и советы
Автоматический откат обновлений — мощный инструмент для повышения стабильности сайта на WordPress. Однако важно помнить, что он не заменяет тщательное тестирование и резервное копирование. Используйте описанные методы в комплексе с грамотным администрированием и мониторингом.
Если вы хотите упростить работу с обновлениями и откатами, обратите внимание на плагины из каталога WPShop — они помогут настроить процесс удобнее и безопаснее.