Автоматизация создания резервных копий в WordPress с помощью кода

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

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

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

Например, вы можете:

  • Резервировать только базу данных или отдельные папки.
  • Отправлять копии на удаленный сервер или в облако.
  • Настраивать частоту создания копий по расписанию.

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

Для полноценной резервной копии WordPress нужно сохранить:

  • Файлы сайта — темы, плагины, медиафайлы (папка wp-content и другие).
  • Базу данных — все записи, настройки и контент.

В нашей реализации мы сделаем упор на автоматический экспорт базы данных и архивирование важных папок в один ZIP-файл.

Экспорт базы данных с помощью PHP

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

Рассмотрим пример кода функции wpset_create_db_backup(), которая подключается к базе, извлекает структуру и данные таблиц и сохраняет дамп в файл:

function wpset_create_db_backup() {
    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 .= $create_table[1] . ";\n\n";

        // Получаем данные таблицы
        $rows = $wpdb->get_results("SELECT * FROM {$table_name}", ARRAY_A);
        foreach ($rows as $row) {
            $columns = array_map(function($col) { return "`" . $col . "`"; }, array_keys($row));
            $values = array_map(function($val) use ($wpdb) { return "'" . esc_sql($val) . "'"; }, array_values($row));
            $sql_dump .= "INSERT INTO `{$table_name}` (" . implode(",", $columns) . ") VALUES (" . implode(",", $values) . ");\n";
        }
        $sql_dump .= "\n";
    }

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

    $filename = $backup_dir . '/db_backup_' . date('Y-m-d_H-i-s') . '.sql';
    file_put_contents($filename, $sql_dump);
    return $filename;
}

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

Архивирование файлов сайта

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

function wpset_create_files_backup() {
    $zip = new ZipArchive();
    $backup_dir = WP_CONTENT_DIR . '/backups';
    if (!file_exists($backup_dir)) {
        mkdir($backup_dir, 0755, true);
    }
    $zip_file = $backup_dir . '/files_backup_' . date('Y-m-d_H-i-s') . '.zip';

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

    $source = WP_CONTENT_DIR . '/uploads';

    $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 $zip_file;
}

Объединяем процесс резервного копирования

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

function wpset_automatic_backup() {
    $db_backup = wpset_create_db_backup();
    $files_backup = wpset_create_files_backup();

    if ($db_backup && $files_backup) {
        // Отправляем уведомление администратору
        wp_mail(
            get_option('admin_email'),
            'Резервная копия WordPress создана',
            "Созданы резервные копии базы данных ({$db_backup}) и файлов ({$files_backup})."
        );
    }
}

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

Чтобы не запускать резервное копирование вручную, настроим планировщик WordPress (WP-Cron).

Добавляем кастомное событие в WP-Cron

Добавьте следующий код в файл functions.php вашей темы или в плагин:

add_action('wpset_daily_backup_event', 'wpset_automatic_backup');

function wpset_activate_backup_schedule() {
    if (!wp_next_scheduled('wpset_daily_backup_event')) {
        // Запускаем каждый день в 03:00 утра
        wp_schedule_event(strtotime('03:00:00'), 'daily', 'wpset_daily_backup_event');
    }
}
add_action('wp', 'wpset_activate_backup_schedule');

Теперь функция wpset_automatic_backup() будет вызываться ежедневно в три часа ночи.

Как проверить работу и отладить

Для отладки можно вызвать функцию вручную, например, через админ-панель или напрямую в коде:

add_action('admin_init', function() {
    if (current_user_can('administrator') && isset($_GET['run_backup'])) {
        wpset_automatic_backup();
        echo 'Резервная копия создана';
        exit;
    }
});
<

Зайдите в админку и добавьте в URL ?run_backup=1 — это запустит резервное копирование вручную.

Использование плагинов для расширения возможностей

Если вам нужно более удобное и функциональное решение, обратите внимание на плагины, которые можно найти на WPSHOP.ru. Например, плагин Clearfy Pro имеет встроенные функции оптимизации и резервного копирования, а Expert Review поможет контролировать состояние сайта и делать бэкапы.

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

Советы по безопасности и хранению резервных копий

Храните резервные копии вне корневой папки сайта, чтобы они не были доступны из браузера. Например, можно настроить отправку копий на удаленный FTP или в облако (Amazon S3, Google Drive). Для этого потребуется дополнительный код или плагины.

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

Как удалить неиспользуемые метаполя в WordPress с помощью кода
30.03.2026
Использование хука woocommerce_order_status_changed для автоматизации в WooCommerce
17.04.2026
Автоматический импорт продуктов из CSV в WooCommerce с помощью кода
24.12.2025
Как создать многоуровневую пагинацию в WordPress: подробное руководство
21.12.2025
Как удалить неиспользуемые таксономии из WordPress через код
25.02.2026