Автоматический откат обновлений WordPress при ошибках: практическое решение

Обновления 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, чтобы сделать процесс обновления максимально надёжным.

WooCommerce: как автоматически изменять стоимость доставки по регионаам клиента
26.06.2026
WooCommerce: автоматическое изменение стоимости доставки по регионам клиента
03.07.2026
Как установить лимит на количество сообщений в формах WordPress
07.03.2026
Как создать автоматический плагин для проверки состояния сайта WordPress
27.01.2026
WooCommerce: как автоматически отключать возможность оформления заказа при отсутствии товара на складе
31.05.2026