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

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

Почему важно делать резервные копии WordPress

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

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

Настройка автоматического резервного копирования с помощью WP-Cron

WP-Cron — встроенный механизм планирования задач в WordPress, который позволяет запускать определённые функции по расписанию без участия пользователя. Мы можем использовать его, чтобы запускать задачу копирования файлов и базы данных автоматически, например, раз в сутки.

Для начала создадим функцию, которая будет делать бэкап.

Создание функции резервного копирования

Ниже пример функции wpassist_backup_site, которая делает архив папки с файлами сайта и экспортирует базу данных в SQL-файл.

function wpassist_backup_site() {
    $upload_dir = wp_upload_dir();
    $backup_dir = $upload_dir['basedir'] . '/wpassist-backups';

    if ( ! file_exists($backup_dir) ) {
        mkdir($backup_dir, 0755, true);
    }

    // Имя архива с датой
    $date = date('Y-m-d-His');
    $zip_path = $backup_dir . "/backup-files-{$date}.zip";
    $sql_path = $backup_dir . "/backup-db-{$date}.sql";

    // Создаём ZIP архив файлов
    $zip = new ZipArchive();
    if ( $zip->open($zip_path, ZipArchive::CREATE) === TRUE ) {
        $rootPath = ABSPATH;
        $files = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::LEAVES_ONLY
        );

        foreach ($files as $name => $file) {
            if (!$file->isDir()) {
                $filePath = $file->getRealPath();
                // Исключаем папку backup
                if (strpos($filePath, $backup_dir) === false) {
                    $relativePath = substr($filePath, strlen($rootPath));
                    $zip->addFile($filePath, $relativePath);
                }
            }
        }
        $zip->close();
    }

    // Экспортируем базу данных
    global $wpdb;
    $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);

    $sql_dump = '';
    foreach ($tables as $table) {
        $table_name = $table[0];
        // Создаём структуру таблицы
        $create_table = $wpdb->get_row("SHOW CREATE TABLE {$table_name}", ARRAY_N);
        $sql_dump .= "DROP TABLE IF EXISTS `{$table_name}`;\n";
        $sql_dump .= $create_table[1] . ";\n\n";

        // Данные таблицы
        $rows = $wpdb->get_results("SELECT * FROM {$table_name}", ARRAY_A);
        foreach ($rows as $row) {
            $vals = array_map(array($wpdb, 'escape'), array_values($row));
            $vals = array_map(function($v) { return "'" . str_replace("'", "''", $v) . "'"; }, $vals);
            $sql_dump .= "INSERT INTO `{$table_name}` VALUES (" . implode(", ", $vals) . ");\n";
        }
        $sql_dump .= "\n";
    }

    file_put_contents($sql_path, $sql_dump);

    // Можно добавить логику уведомления или очистку старых бэкапов
}

Регистрация задачи WP-Cron

Теперь нужно добавить событие, которое будет запускать функцию wpassist_backup_site регулярно, например, раз в день.

function wpassist_schedule_backup() {
    if ( ! wp_next_scheduled( 'wpassist_daily_backup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpassist_daily_backup' );
    }
}
add_action('wp', 'wpassist_schedule_backup');

add_action('wpassist_daily_backup', 'wpassist_backup_site');

Так мы настроим ежедневное выполнение резервного копирования.

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

Резервные копии сохраняются в папке wp-content/uploads/wpassist-backups. Рекомендуется регулярно скачивать эти архивы на локальный компьютер или в облачное хранилище, чтобы обезопасить данные при проблемах с сервером.

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

Альтернативы и плагины для резервного копирования

Если вы не хотите писать код, можно использовать проверенные плагины, например:

  • Clearfy Pro — многофункциональный плагин с возможностями оптимизации и бэкапа.
  • WPRemark — хотя в основном для комментариев, но может помочь в автоматизации.

Но если нужен лёгкий и контролируемый способ — наш код отлично подходит.

Советы по безопасности резервного копирования

При создании резервных копий важно:

  • Хранить бэкапы в папках, недоступных через веб или защищённых паролем.
  • Регулярно очищать старые архивы, чтобы не переполнять диск.
  • Использовать шифрование, если копии содержат конфиденциальные данные.
  • Тестировать восстановление, чтобы быть уверенным в работоспособности бэкапов.

Пример добавления базовой защиты папки с бэкапами — создание файла .htaccess внутри wpassist-backups со следующим содержимым:

deny from all

Это запретит доступ по HTTP к резервным копиям.

Заключение

Создание автоматического резервного копирования WordPress без плагинов — задача вполне решаемая с помощью PHP и WP-Cron. Такой подход даёт полный контроль и минимальную нагрузку на сайт.

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

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

Как создать настройку в WordPress для пользователя
01.11.2025
Автоматический импорт товаров в WooCommerce из CSV файла: практическое руководство
20.03.2026
WooCommerce: автоматическое изменение стоимости товаров по расписанию
29.05.2026
Как создать автозаполняемое поле в формах WordPress с примерами кода
11.03.2026
Как создать автономную систему комментирования в WordPress с AJAX
16.04.2026