Обновления WordPress, плагинов и тем необходимы для безопасности и функциональности сайта. Но иногда после обновления возникают ошибки, которые могут привести к недоступности сайта или нарушению его работы. В этой статье мы разберём, как реализовать автоматический откат обновлений WordPress при возникновении ошибок. Такой подход позволит быстро вернуть сайт в рабочее состояние без ручного вмешательства.
Почему важен откат обновлений WordPress
Обновления — это всегда риск. Даже тестированные версии плагинов и тем могут конфликтовать с вашим окружением. Если после обновления плагина сайт начал выдавать ошибку 500 или перестал работать функционал, нужно как можно быстрее вернуть рабочую версию.
Ручной откат — длительный и сложный процесс: нужно зайти на сервер, заменить файлы, иногда восстанавливать базу данных. Автоматизация этого процесса поможет избежать простоя сайта и сэкономить время.
В современных решениях для управления WordPress (например, WPGPT от WPSHOP) уже есть функции мониторинга и отката, но не всегда удобно или возможно их использовать. Поэтому рассмотрим, как реализовать собственное решение.
Как реализовать автоматический откат обновлений: основные принципы
Идея проста: перед обновлением сохраняем текущую рабочую версию плагина/темы или ядра, после обновления проверяем работоспособность сайта, и если обнаруживаем критические ошибки — автоматически возвращаем сохранённую версию.
Основные этапы:
- Снятие резервной копии файлов обновляемого компонента.
- Обновление компонента.
- Проверка работоспособности (например, тест на HTTP-ответ или выполнение тестового запроса).
- В случае ошибки — откат к резервной копии.
Снятие резервной копии
Для плагинов и тем достаточно скопировать их папку из wp-content/plugins или wp-content/themes в отдельную директорию резервных копий в wp-content/backups. Для ядра — сложнее, но обычно достаточно резервировать wp-includes и wp-admin.
Пример функции для резервного копирования папки плагина:
function wpdigest_backup_plugin($plugin_slug) {
$src = WP_CONTENT_DIR . '/plugins/' . $plugin_slug;
$dest = WP_CONTENT_DIR . '/backups/plugins/' . $plugin_slug . '_' . time();
if (!file_exists($dest)) {
mkdir($dest, 0755, true);
}
// Рекурсивное копирование
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($src));
foreach ($it as $file) {
if ($file->isFile()) {
$dest_file = $dest . str_replace($src, '', $file->getPathname());
$dest_dir = dirname($dest_file);
if (!file_exists($dest_dir)) {
mkdir($dest_dir, 0755, true);
}
copy($file->getPathname(), $dest_file);
}
}
return $dest;
}
Обновление компонента
Обновлять плагины и темы можно штатными средствами WordPress через функции API. Например, для плагинов используется класс Plugin_Upgrader. Мы можем инициировать обновление программно.
Пример обновления плагина:
function wpdigest_update_plugin($plugin_slug) {
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
$upgrader = new Plugin_Upgrader();
$result = $upgrader->upgrade($plugin_slug . '/' . $plugin_slug . '.php');
return $result;
}
Проверка работоспособности сайта после обновления
Самый простой способ — отправить HTTP-запрос к главной странице сайта и проверить код ответа. Если он не 200, значит что-то пошло не так.
Пример функции проверки:
function wpdigest_check_site_status() {
$response = wp_remote_get(home_url());
if (is_wp_error($response)) {
return false;
}
$code = wp_remote_retrieve_response_code($response);
return ($code === 200);
}
Откат обновления
Если проверка показала, что сайт не работает корректно, нужно вернуть старую версию. Для этого удаляем обновлённую папку и копируем обратно из резервной копии.
Пример функции отката:
function wpdigest_rollback_plugin($plugin_slug, $backup_path) {
$plugin_path = WP_CONTENT_DIR . '/plugins/' . $plugin_slug;
// Удаляем обновлённую версию
wpdigest_rrmdir($plugin_path);
// Копируем обратно из резервной копии
wpdigest_copy_dir($backup_path, $plugin_path);
}
function wpdigest_rrmdir($dir) {
if (!is_dir($dir)) return;
$files = array_diff(scandir($dir), array('.', '..'));
foreach ($files as $file) {
$path = "$dir/$file";
if (is_dir($path)) {
wpdigest_rrmdir($path);
} else {
unlink($path);
}
}
rmdir($dir);
}
function wpdigest_copy_dir($src, $dst) {
$dir = opendir($src);
@mkdir($dst);
while(false !== ($file = readdir($dir))) {
if (($file != '.') && ($file != '..')) {
if (is_dir($src . '/' . $file)) {
wpdigest_copy_dir($src . '/' . $file, $dst . '/' . $file);
} else {
copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
}
Полная последовательность автоматического обновления с откатом
Объединим все шаги в одну функцию, которая:
- Создаст резервную копию.
- Обновит плагин.
- Проверит сайт.
- В случае ошибки — выполнит откат.
function wpdigest_auto_update_plugin_with_rollback($plugin_slug) {
$backup_path = wpdigest_backup_plugin($plugin_slug);
if (!$backup_path) {
error_log('WP Digest: Ошибка создания резервной копии плагина ' . $plugin_slug);
return false;
}
$update_result = wpdigest_update_plugin($plugin_slug);
if (!$update_result) {
error_log('WP Digest: Ошибка обновления плагина ' . $plugin_slug);
return false;
}
// Проверяем сайт
if (!wpdigest_check_site_status()) {
// Откат
wpdigest_rollback_plugin($plugin_slug, $backup_path);
error_log('WP Digest: Обновление плагина ' . $plugin_slug . ' привело к ошибке, выполнен откат.');
return false;
}
// Всё прошло успешно
return true;
}
Полезные плагины для автоматизации обновлений и отката
Если вы не хотите писать собственный код, обратите внимание на плагины, которые облегчают управление обновлениями и восстановлением:
- WP Rollback — позволяет вручную откатывать версии плагинов и тем.
- Easy Updates Manager — расширенное управление автообновлениями с возможностью настроек.
- Backup plugins (например, UpdraftPlus) — автоматическое бэкапирование перед обновлениями.
В сочетании с собственными скриптами можно добиться высокого уровня безопасности и безотказности.
Заключение
Автоматический откат обновлений WordPress — важный инструмент для поддержки стабильности сайта. Реализовав описанный механизм, вы сможете минимизировать простой и быстро реагировать на ошибки после обновлений. Используйте примеры кода как основу, адаптируйте под конкретные задачи, и интегрируйте с другими инструментами, например, WPSHOP, чтобы сделать процесс обновления максимально надёжным.