wphow.ru wordpress WPHow

Как сделать автоматический откат обновлений WordPress при ошибках

Почему важен автоматический откат обновлений в WordPress

Обновления ядра, тем и плагинов WordPress необходимы для безопасности и функционала сайта. Однако иногда после обновления появляются критические ошибки: несовместимости, конфликты с другими плагинами или темами, что приводит к падению сайта и потере доступа к админке. В таких случаях критично быстро вернуть сайт в рабочее состояние, вернувшись к предыдущей версии обновленного компонента. Ручной откат требует времени и навыков, особенно если обновлений много. Автоматический откат позволит минимизировать простой и потерю посетителей.

В этой статье разберем, как реализовать автоматический rollback обновлений WordPress с помощью готовых решений и кастомного кода.

Обзор плагинов для отката обновлений WordPress

Плагин WP Rollback

WP Rollback — один из самых популярных бесплатных плагинов, который позволяет откатить конкретный плагин или тему к любой предыдущей версии через админку WordPress. Он не делает автоматический откат после неудачного обновления, но упрощает ручной откат до нужной версии.

Преимущества:

  • Простота использования
  • Поддержка тем и плагинов из официального репозитория
  • Безопасный откат — сохраняет настройки

Недостаток — нет автоматического отката при ошибках после обновления.

Плагин WP Downgrade | Specific Core Version

Этот плагин позволяет контролировать версию ядра WordPress, на которую вы хотите откатиться, но также не автоматизирует процесс отката при ошибках.

Плагин Easy Updates Manager

Предоставляет гибкие настройки автоматических обновлений и уведомлений, но не поддерживает автоматический откат.

Вывод: готовых плагинов с автоматическим откатом пока нет, однако с помощью хуков WordPress можно реализовать собственное решение.

Как реализовать автоматический откат обновлений через код

Идея решения

Основная задача — отследить неудачное обновление (например, при фатальной ошибке или падении сайта) и вернуть предыдущую версию обновленного компонента. Для этого нужно:

  • Перед обновлением сохранить текущую версию плагина/темы (файлы и версия)
  • Обновить компонент
  • Проверить, работает ли сайт корректно (например, через запрос к странице или тестовую функцию)
  • Если тест не пройден, откатить файлы к сохраненной версии

Такой подход требует дополнительного пространства на сервере и точной логики работы.

Пример кода для сохранения и отката плагина

Ниже пример функции для сохранения текущей папки плагина в отдельное место перед обновлением и восстановления в случае ошибки. Код упрощенный и требует доработки под конкретные задачи.

function wphow_backup_plugin_before_update($plugin_slug) {
    $upload_dir = wp_upload_dir();
    $backup_dir = $upload_dir['basedir'] . '/wphow_plugin_backups/' . $plugin_slug;
    $plugin_dir = WP_PLUGIN_DIR . '/' . $plugin_slug;
    if (!file_exists($backup_dir)) {
        mkdir($backup_dir, 0755, true);
    }
    // Копируем файлы плагина
    wphow_recursive_copy($plugin_dir, $backup_dir);
}

function wphow_recursive_copy($src, $dst) {
    $dir = opendir($src);
    @mkdir($dst);
    while(false !== ($file = readdir($dir))) {
        if (($file != '.') && ($file != '..')) {
            if (is_dir($src . '/' . $file)) {
                wphow_recursive_copy($src . '/' . $file, $dst . '/' . $file);
            } else {
                copy($src . '/' . $file, $dst . '/' . $file);
            }
        }
    }
    closedir($dir);
}

function wphow_restore_plugin_backup($plugin_slug) {
    $upload_dir = wp_upload_dir();
    $backup_dir = $upload_dir['basedir'] . '/wphow_plugin_backups/' . $plugin_slug;
    $plugin_dir = WP_PLUGIN_DIR . '/' . $plugin_slug;
    if (file_exists($backup_dir)) {
        // Удаляем текущий плагин
        wphow_recursive_delete($plugin_dir);
        // Восстанавливаем файлы из бэкапа
        wphow_recursive_copy($backup_dir, $plugin_dir);
    }
}

function wphow_recursive_delete($dir) {
    if (!file_exists($dir)) return;
    if (!is_dir($dir)) {
        unlink($dir);
        return;
    }
    foreach(scandir($dir) as $item) {
        if ($item == '.' || $item == '..') continue;
        wphow_recursive_delete($dir . '/' . $item);
    }
    rmdir($dir);
}

Этот код нужно вызывать перед обновлением плагина для сохранения его текущей версии. После обновления выполнить проверку сайта, и если будут ошибки, вызвать функцию восстановления.

Отслеживание обновлений и ошибок

WordPress предоставляет хук upgrader_process_complete, который срабатывает после завершения обновления плагина, темы или ядра. Можно использовать его для запуска проверки сайта и принятия решения об откате.

add_action('upgrader_process_complete', 'wphow_check_and_rollback', 10, 2);
function wphow_check_and_rollback($upgrader_object, $options) {
    if ($options['action'] == 'update' && $options['type'] == 'plugin') {
        $updated_plugins = $options['plugins'];
        foreach ($updated_plugins as $plugin_file) {
            $plugin_slug = dirname($plugin_file);
            // Проверяем работоспособность сайта
            if (!wphow_test_site()) {
                wphow_restore_plugin_backup($plugin_slug);
                error_log("Plugin {$plugin_slug} restored due to update failure.");
            }
        }
    }
}

function wphow_test_site() {
    // Пример простой проверки
    $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);
}

В функции wphow_test_site() можно реализовать более сложные проверки, например, запрос к API сайта или тестовые запросы к страницам с критичной функциональностью.

Рекомендации по использованию и настройке

1. Регулярные бэкапы: Автоматический откат не заменяет полные бэкапы сайта. Рекомендуется использовать плагины для резервного копирования, например, Clearfy Pro или другие решения.

2. Контроль обновлений: Используйте плагин Easy Updates Manager для гибкого управления автоматическими обновлениями.

3. Тестирование на staging-сервере: Перед обновлениями на боевом сайте желательно проверять изменения на тестовой копии.

4. Логирование ошибок: Включите логирование PHP и ошибок WordPress, чтобы быстро реагировать на сбои.

Заключение

Автоматический откат обновлений в WordPress — редкая, но очень полезная функция, которая поможет сохранить работоспособность сайта при ошибках обновлений. Готовых решений пока мало, но с помощью хуков и кастомного кода можно реализовать удобный механизм, который сохранит файлы плагинов или тем, проверит сайт после обновления и при необходимости вернет рабочую версию.

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

×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙