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

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

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

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

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

Основные компоненты резервной копии WordPress

Резервная копия сайта должна включать:

  • Файлы сайта — все файлы WordPress, темы, плагины, медиафайлы.
  • Базу данных MySQL — все записи, записи пользователей, настройки и контент.

Отдельно рассмотрим, как получить резервную копию каждого компонента.

Создаем резервную копию файлов сайта с помощью PHP

Для создания архива файлов удобно использовать встроенные возможности PHP и расширение ZipArchive. Напишем функцию, которая создаст ZIP-архив корневой директории сайта.

function wpkpi_create_files_backup($source, $destination) {
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }
    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }
    $source = realpath($source);
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($source),
        RecursiveIteratorIterator::LEAVES_ONLY
    );
    foreach ($files as $name => $file) {
        if (!$file->isDir()) {
            $filePath = $file->getRealPath();
            $relativePath = substr($filePath, strlen($source) + 1);
            $zip->addFile($filePath, $relativePath);
        }
    }
    $zip->close();
    return file_exists($destination);
}

Пример использования функции:

$backupFile = __DIR__ . '/backup-files-' . date('Y-m-d-H-i-s') . '.zip';
$sourceDir = __DIR__;
wpkpi_create_files_backup($sourceDir, $backupFile);

Эта функция создает архив всех файлов сайта, кроме тех, что исключены системой. Можно дополнительно настроить фильтры для исключения больших папок, например, wp-content/cache.

Создаем резервную копию базы данных MySQL

Для резервного копирования базы данных используем команду mysqldump, запущенную из PHP через exec(). Для этого нужны параметры доступа к базе из wp-config.php:

define('DB_NAME', 'database_name_here');
define('DB_USER', 'username_here');
define('DB_PASSWORD', 'password_here');
define('DB_HOST', 'localhost');

Создаем функцию для дампа базы в SQL-файл:

function wpkpi_create_db_backup($backupFile) {
    require __DIR__ . '/wp-config.php';
    $command = sprintf(
        'mysqldump --user=%s --password=%s --host=%s %s > %s',
        escapeshellarg(DB_USER),
        escapeshellarg(DB_PASSWORD),
        escapeshellarg(DB_HOST),
        escapeshellarg(DB_NAME),
        escapeshellarg($backupFile)
    );
    exec($command, $output, $return_var);
    return $return_var === 0 && file_exists($backupFile);
}

Использование функции:

$dbBackupFile = __DIR__ . '/backup-db-' . date('Y-m-d-H-i-s') . '.sql';
wpkpi_create_db_backup($dbBackupFile);

Важно: сервер должен иметь доступ к mysqldump, а PHP должен разрешать запуск exec(). В некоторых хостингах это запрещено — тогда придется использовать другие методы.

Настраиваем автоматический запуск резервного копирования через Cron

Чтобы резервные копии создавались автоматически, настроим Cron-задачу на сервере. Создадим файл backup.php в корне сайта с таким содержимым:

<?php

// Создаем резервную копию файлов
$backupFile = __DIR__ . '/backup-files-' . date('Y-m-d-H-i-s') . '.zip';
wpkpi_create_files_backup(__DIR__, $backupFile);

// Создаем резервную копию базы данных
$dbBackupFile = __DIR__ . '/backup-db-' . date('Y-m-d-H-i-s') . '.sql';
wpkpi_create_db_backup($dbBackupFile);

// Функции здесь (или подключить из отдельного файла)
function wpkpi_create_files_backup($source, $destination) {
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }
    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }
    $source = realpath($source);
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($source),
        RecursiveIteratorIterator::LEAVES_ONLY
    );
    foreach ($files as $name => $file) {
        if (!$file->isDir()) {
            $filePath = $file->getRealPath();
            $relativePath = substr($filePath, strlen($source) + 1);
            $zip->addFile($filePath, $relativePath);
        }
    }
    $zip->close();
    return file_exists($destination);
}

function wpkpi_create_db_backup($backupFile) {
    require __DIR__ . '/wp-config.php';
    $command = sprintf(
        'mysqldump --user=%s --password=%s --host=%s %s > %s',
        escapeshellarg(DB_USER),
        escapeshellarg(DB_PASSWORD),
        escapeshellarg(DB_HOST),
        escapeshellarg(DB_NAME),
        escapeshellarg($backupFile)
    );
    exec($command, $output, $return_var);
    return $return_var === 0 && file_exists($backupFile);
}
?>

Затем добавим в Cron задачу, например, на ежедневное выполнение в 3 часа ночи:

0 3 * * * /usr/bin/php /path/to/wordpress/backup.php
<

Путь к PHP и скрипту замените на актуальные для вашего сервера.

Хранение и очистка старых резервных копий

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

function wpkpi_cleanup_old_backups($dir, $days = 30) {
    $files = glob($dir . '/backup-*');
    $now = time();
    foreach ($files as $file) {
        if (is_file($file)) {
            if ($now - filemtime($file) >= 60 * 60 * 24 * $days) {
                unlink($file);
            }
        }
    }
}

wpkpi_cleanup_old_backups(__DIR__, 30);

Добавьте этот вызов в конец вашего backup.php, чтобы старые резервные копии автоматически удалялись.

Резервное копирование с отправкой на удаленный сервер или облако

Для повышения надежности полезно хранить копии не только локально, но и в облаке или на удаленном сервере. Для этого можно использовать FTP, SCP или API сервисов, например, Amazon S3.

Пример отправки файла по FTP:

function wpkpi_ftp_upload($localFile, $remoteFile) {
    $ftp_server = 'ftp.example.com';
    $ftp_user = 'username';
    $ftp_pass = 'password';

    $conn_id = ftp_connect($ftp_server);
    if (!$conn_id) return false;

    $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
    if (!$login_result) {
        ftp_close($conn_id);
        return false;
    }

    ftp_pasv($conn_id, true);
    $upload = ftp_put($conn_id, $remoteFile, $localFile, FTP_BINARY);
    ftp_close($conn_id);
    return $upload;
}

После создания бэкапа вызовите:

wpkpi_ftp_upload($backupFile, '/backups/' . basename($backupFile));
wpkpi_ftp_upload($dbBackupFile, '/backups/' . basename($dbBackupFile));

Настройте параметры FTP под свои данные.

Полезные плагины для резервного копирования, если решите использовать готовые решения

Если в будущем нужна более простая настройка, обратите внимание на плагины:

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

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

Итоги и рекомендации

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

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

Как автоматизировать управление контентом в WordPress с помощью WPKPI
29.12.2025
WooCommerce: автоматическое удаление заказов по истечении срока
14.05.2026
WooCommerce: автоматическое изменение статуса заказа при проблемах с платежами
18.06.2026
Как добавить вывод данных из метаполя в WordPress теме
16.01.2026
Как создать динамическую картинку из метаданных поста WordPress
19.12.2025