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

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

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

Обычно при обновлении WordPress или плагинов мы полагаемся на стабильность новых версий. Но в реальности даже проверенные обновления могут вызвать проблемы из-за:

  • Конфликтов с другими плагинами или темой.
  • Изменений в API или базе данных.
  • Ошибок в самом обновлении.
  • Особенностей хостинга и окружения.

Если сайт перестал работать, простое решение — откатить обновление. Но делать это вручную неудобно и небезопасно, особенно если сайт большой и обновлений много. Автоматизация rollback поможет быстро восстановить сайт и уведомить администратора.

Обзор существующих решений для отката обновлений

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

Мы рассмотрим, как реализовать собственный механизм автоматического rollback обновлений WordPress с помощью хуков и PHP.

Как работает механизм автоматического rollback: основные этапы

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

Основные шаги:

  1. Сохраняем текущие файлы плагина, темы или ядра перед обновлением.
  2. Запускаем обновление стандартным механизмом WordPress.
  3. Проводим тест работоспособности: например, проверяем доступность сайта, отсутствие фатальных ошибок.
  4. Если тест не прошёл, восстанавливаем сохранённые файлы (rollback).
  5. Отправляем уведомление администратору о произошедшем откате.

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

Рассмотрим пример, как реализовать подобный механизм для обновлений плагинов. Мы создадим несколько функций, которые будут работать через хуки WordPress.

Сначала создадим функцию для сохранения текущей версии плагина в архив перед обновлением:

function wpsolution_before_plugin_update_backup( $plugin ) {
    $plugin_dir = WP_PLUGIN_DIR . '/' . dirname( $plugin );
    $backup_dir = WP_CONTENT_DIR . '/wpsolution-backups/plugins/' . dirname( $plugin );
    if ( ! file_exists( $backup_dir ) ) {
        wp_mkdir_p( $backup_dir );
    }
    // Копируем текущие файлы плагина в backup
    wpsolution_copy_dir( $plugin_dir, $backup_dir );
}

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

Далее добавим хук, который сработает перед обновлением плагина:

add_action( 'upgrader_pre_install', function( $true, $hook_extra ) {
    if ( isset( $hook_extra['plugin'] ) ) {
        wpsolution_before_plugin_update_backup( $hook_extra['plugin'] );
    }
    return $true;
}, 10, 2 );

После обновления нужно проверить, нет ли ошибок. Для этого используем shutdown hook и проверяем наличие фатальных ошибок:

register_shutdown_function( function() {
    $error = error_get_last();
    if ( $error && in_array( $error['type'], [ E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR ] ) ) {
        // Произошла фатальная ошибка, запускаем rollback
        wpsolution_rollback_plugin_update();
    }
});

Функция восстановления из бэкапа:

function wpsolution_rollback_plugin_update() {
    $backup_dir = WP_CONTENT_DIR . '/wpsolution-backups/plugins/';
    // Здесь нужно реализовать логику восстановления последних сохранившихся бэкапов
    // Для простоты рассмотрим пример для одного плагина
    $plugin_slug = 'example-plugin'; // заменить на динамическое определение
    $backup_path = $backup_dir . $plugin_slug;
    $plugin_path = WP_PLUGIN_DIR . '/' . $plugin_slug;

    if ( file_exists( $backup_path ) ) {
        // Удаляем текущие файлы плагина
        wpsolution_delete_dir( $plugin_path );
        // Копируем обратно из бэкапа
        wpsolution_copy_dir( $backup_path, $plugin_path );
        // Отправляем уведомление
        wp_mail( get_option('admin_email'), 'Rollback обновления плагина', 'Автоматический откат обновления плагина ' . $plugin_slug . ' выполнен из-за ошибки.');
    }
}

function wpsolution_delete_dir( $dirPath ) {
    if ( ! is_dir( $dirPath ) ) {
        return;
    }
    $objects = scandir( $dirPath );
    foreach ( $objects as $object ) {
        if ( $object != '.' && $object != '..' ) {
            $currentPath = $dirPath . DIRECTORY_SEPARATOR . $object;
            if ( is_dir( $currentPath ) ) {
                wpsolution_delete_dir( $currentPath );
            } else {
                unlink( $currentPath );
            }
        }
    }
    rmdir( $dirPath );
}

Расширение механизма для тем и ядра WordPress

Для тем и ядра WordPress принцип похожий — нужно сохранять архив текущей версии, затем при ошибке восстанавливать из архива.

Для ядра можно использовать хук upgrader_pre_install с параметром $hook_extra['type'] === 'core', для тем — $hook_extra['theme'].

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

Как проверить успешность обновления

Проверка может выполняться несколькими способами:

  • Проверка HTTP-ответа сайта (например, curl запрос к главной странице)
  • Отсутствие ошибок PHP (через error_get_last)
  • Проверка наличия определённых функций или классов, если обновление связано с API

В зависимости от конкретного сайта и задач можно выбрать подходящий способ.

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

Сохранять резервные копии перед каждым обновлением — важно, но это увеличивает место на диске. Рекомендуется реализовать ротацию бэкапов и удалять устаревшие версии.

Для уведомлений используйте email и/или интеграцию с системами мониторинга.

Проверяйте права доступа к папкам backup и корректность их создания.

Полезные плагины для автоматизации и контроля обновлений

Для расширенного контроля обновлений и откатов можно использовать плагины, например:

  • WP Rollback — для ручного отката плагинов и тем.
  • Clearfy Pro — оптимизация и безопасность, включая контроль обновлений.

Для более сложных сценариев можно написать плагин, основанный на приведённом примере кода.

Как отключить автоматические обновления WordPress
03.01.2026
Как создать автоматическое удаление старых комментариев в WordPress
26.03.2026
Как использовать REST API для создания микросервисов в WordPress
06.02.2026
Автоматическая замена контента в WordPress: практическое решение с использованием WPRemark
15.04.2026
Как использовать Metabox для создания дополнительных полей в WordPress
15.12.2025