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

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

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

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

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

Основные задачи при создании резервной копии

Для создания полноценной резервной копии WordPress необходимо:

  • Сделать архив файлов сайта: темы, плагины, медиа и ядро WordPress.
  • Сделать дамп базы данных MySQL с данными сайта.
  • Сохранить оба файла в безопасном месте с понятным именованием и датой.
  • Настроить автоматический запуск этих задач по расписанию.

Настройка резервного копирования файлов сайта

Начнём с создания архива файлов. Для этого можно использовать встроенные функции PHP и WordPress. Ниже представлен пример функции wpelement_backup_files(), которая создаёт zip-архив каталога с сайтом.

function wpelement_backup_files() {
    $upload_dir = wp_upload_dir();
    $backup_dir = $upload_dir['basedir'] . '/backups';
    if (!file_exists($backup_dir)) {
        mkdir($backup_dir, 0755, true);
    }
    $zip = new ZipArchive();
    $backup_file = $backup_dir . '/files_backup_' . date('Y-m-d_H-i-s') . '.zip';
    if ($zip->open($backup_file, ZipArchive::CREATE) === TRUE) {
        $rootPath = realpath(ABSPATH);
        $files = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($rootPath),
            RecursiveIteratorIterator::LEAVES_ONLY
        );
        foreach ($files as $name => $file) {
            if (!$file->isDir()) {
                $filePath = $file->getRealPath();
                $relativePath = substr($filePath, strlen($rootPath) + 1);
                $zip->addFile($filePath, $relativePath);
            }
        }
        $zip->close();
        return $backup_file;
    } else {
        return false;
    }
}

В этом коде мы создаём папку backups в каталоге загрузок WordPress и архивируем в неё корневую папку сайта. Архив получает имя с датой и временем создания. Такой подход удобен для хранения нескольких версий бэкапов.

Создание резервной копии базы данных WordPress

Для дампа базы данных мы можем воспользоваться командой mysqldump, которая обычно доступна на хостингах, либо сделать экспорт через PHP. Ниже пример функции wpelement_backup_database(), создающей дамп базы данных и сохраняющей его в папку с бэкапами.

function wpelement_backup_database() {
    global $wpdb;
    $upload_dir = wp_upload_dir();
    $backup_dir = $upload_dir['basedir'] . '/backups';
    if (!file_exists($backup_dir)) {
        mkdir($backup_dir, 0755, true);
    }
    $filename = $backup_dir . '/db_backup_' . date('Y-m-d_H-i-s') . '.sql';

    $command = sprintf(
        'mysqldump --user=%s --password=%s --host=%s %s > %s',
        DB_USER,
        DB_PASSWORD,
        DB_HOST,
        DB_NAME,
        escapeshellarg($filename)
    );

    system($command, $output);
    if ($output === 0 && file_exists($filename)) {
        return $filename;
    } else {
        return false;
    }
}

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

Автоматизация процесса с помощью WP-Cron и системного cron

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

Лучшее решение — создать PHP-скрипт с вызовом наших функций и настроить системный cron на сервере, который будет запускать этот скрипт по расписанию.

Пример простого PHP-скрипта backup-script.php:

<?php
require_once('/путь/к/wp-load.php');

$filesBackup = wpelement_backup_files();
$dbBackup = wpelement_backup_database();

if ($filesBackup && $dbBackup) {
    echo "Резервное копирование успешно выполнено:\n";
    echo "Файлы: $filesBackup\n";
    echo "База данных: $dbBackup\n";
} else {
    echo "Ошибка при создании резервной копии.";
}

Далее в crontab добавляем задачу:

0 3 * * * /usr/bin/php /путь/к/backup-script.php > /dev/null 2>&1

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

Как хранить и защищать резервные копии WordPress

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

Можно настроить автоматическую отправку архивов на удалённый сервер по FTP/SFTP, в облако (Google Drive, Dropbox) или использовать специализированные решения. Вот пример отправки файла на FTP с помощью PHP:

function wpelement_send_backup_to_ftp($file) {
    $ftp_server = 'ftp.example.com';
    $ftp_user = 'username';
    $ftp_pass = 'password';
    $conn_id = ftp_connect($ftp_server);
    $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
    if (!$conn_id || !$login_result) {
        return false;
    }
    ftp_pasv($conn_id, true);
    $remote_file = basename($file);
    $upload = ftp_put($conn_id, $remote_file, $file, FTP_BINARY);
    ftp_close($conn_id);
    return $upload;
}

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

Советы по оптимизации и безопасности бэкапов WordPress

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

2. Шифруйте архивы или базу данных, если в них есть чувствительная информация.

3. Убедитесь, что папка с бэкапами недоступна через веб, добавив .htaccess или запрет на выполнение скриптов.

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

5. Логируйте процесс создания копий и ошибки для быстрого выявления проблем.

Заключение

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

Как решить проблемы с кэшированием в WordPress
15.11.2025
Как отключить e-mail уведомления от автоматических сообщений WordPress
22.02.2026
Как избежать проблем с конфликтами между плагинами в WordPress
21.12.2025
Как создать автоматический импорт постов в WordPress из внешнего источника
25.12.2025
Оптимизация пользовательских полей для вариативных товаров в WooCommerce на WordPress
02.03.2026