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

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

Почему стоит делать резервные копии вручную и без плагинов

Плагины для резервного копирования удобны, но имеют ряд недостатков:

  • Увеличивают нагрузку на сайт и могут конфликтовать с другими расширениями.
  • Зависимость от разработчика плагина — обновления и поддержка могут прекратиться.
  • Некоторые плагины платные или имеют ограничения в бесплатных версиях.

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

  • Точно контролировать процесс и формат бэкапа.
  • Не нагружать сайт лишними плагинами.
  • Автоматизировать задачу по расписанию с помощью WP-Cron.

Основные компоненты резервного копирования WordPress

Сайт WordPress состоит из двух ключевых частей, которые нужно сохранять:

  1. Файлы сайта: темы, плагины, загрузки, ядро WordPress.
  2. База данных: все записи, настройки, пользователи и пр.

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

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

Для архивации файлов используем стандартный класс ZipArchive PHP. Ниже пример функции, которая создает zip-архив с папкой wp-content/uploads — самой большой и часто изменяемой частью сайта. Аналогично можно архивировать и другие директории.

function wpone_backup_create_files_zip($backup_dir) {
    $zip = new ZipArchive();
    $zip_name = $backup_dir . '/uploads_backup_' . date('Y-m-d_H-i-s') . '.zip';

    if ($zip->open($zip_name, ZipArchive::CREATE) !== TRUE) {
        return false;
    }

    $upload_dir = WP_CONTENT_DIR . '/uploads';

    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($upload_dir),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $name => $file) {
        if (!$file->isDir()) {
            $file_path = $file->getRealPath();
            $relative_path = substr($file_path, strlen($upload_dir) + 1);
            $zip->addFile($file_path, $relative_path);
        }
    }

    $zip->close();
    return $zip_name;
}

В этом примере создается архив с файлами из папки uploads. Можно расширить функцию для архивации wp-content/themes и wp-content/plugins по аналогии.

Создание дампа базы данных

Для создания резервной копии базы данных вызовем системную команду mysqldump с параметрами из wp-config.php. Вот пример функции:

function wpone_backup_create_db_dump($backup_dir) {
    global $wpdb;
    
    $db_name = DB_NAME;
    $db_user = DB_USER;
    $db_password = DB_PASSWORD;
    $db_host = DB_HOST;

    $dump_file = $backup_dir . '/db_backup_' . date('Y-m-d_H-i-s') . '.sql';

    $command = "mysqldump --user={$db_user} --password={$db_password} --host={$db_host} {$db_name} > {$dump_file}";
    system($command, $retval);

    if ($retval === 0) {
        return $dump_file;
    } else {
        return false;
    }
}

Для работы этой функции на сервере должна быть установлена утилита mysqldump, а PHP иметь доступ к системным командам.

Автоматизация резервного копирования с WP-Cron

Чтобы резервное копирование выполнялось автоматически, зарегистрируем собственное событие WP-Cron:

add_action('wpone_backup_cron_event', 'wpone_backup_run');

function wpone_backup_run() {
    $backup_dir = WP_CONTENT_DIR . '/backups';
    if (!file_exists($backup_dir)) {
        mkdir($backup_dir, 0755, true);
    }

    $file_backup = wpone_backup_create_files_zip($backup_dir);
    $db_backup = wpone_backup_create_db_dump($backup_dir);

    if ($file_backup && $db_backup) {
        error_log('Резервное копирование выполнено успешно: ' . $file_backup . ', ' . $db_backup);
    } else {
        error_log('Ошибка при выполнении резервного копирования');
    }
}

// Планируем событие, если оно еще не запланировано
if (!wp_next_scheduled('wpone_backup_cron_event')) {
    wp_schedule_event(time(), 'daily', 'wpone_backup_cron_event');
}

Этот код планирует ежедневное выполнение функции wpone_backup_run, которая создает резервные копии файлов и базы данных.

Отправка резервных копий на email или облачное хранилище

Для дополнительной безопасности рекомендуется копии сохранять не только на сервере, но и где-то еще. Например, отправлять архивы на email или загружать на облако — Google Drive, Dropbox. Здесь приведу пример отправки на email средствами WordPress:

function wpone_backup_send_email($file_path) {
    $to = get_option('admin_email');
    $subject = 'Резервная копия сайта WordPress';
    $message = 'Во вложении резервная копия сайта.';

    $attachments = array($file_path);

    wp_mail($to, $subject, $message, '', $attachments);
}

В функцию wpone_backup_run можно добавить вызов этой функции для отправки созданных архивов.

Использование плагина Clearfy Pro для расширенного резервного копирования

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

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

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

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

Пример удаления архивов старше 7 дней:

function wpone_backup_cleanup_old($backup_dir) {
    $files = glob($backup_dir . '/*');
    $now = time();

    foreach ($files as $file) {
        if (is_file($file) && ($now - filemtime($file)) > 7 * 24 * 60 * 60) {
            unlink($file);
        }
    }
}

Вызывайте эту функцию в процессе резервного копирования, чтобы архивы не накапливались.

Как использовать Transients в WordPress для кэширования данных
27.11.2025
Как создать динамическую форму на WordPress с подтверждением и обработкой данных
03.01.2026
Как удалить бесполезные мета данные из базы WordPress без потерь
12.01.2026
Как добавить автоматическое сохранение записей в WordPress
13.12.2025
Как отладить проблемы с отправкой писем в WordPress
09.02.2026