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

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

Почему важен автоматический бэкап файлов WordPress

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

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

Встроенные решения и популярные плагины (например, UpdraftPlus, BackWPup) отлично справляются с задачей, но если вы хотите создать кастомное решение, которое будет адаптировано под ваши нужды, то следующий раздел для вас.

Как работает резервный копировщик: базовые принципы и WP-Cron

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

Принцип работы:
1. Запускается функция создания архива файлов.
2. Архив сохраняется в заданную папку с уникальным именем (например, с текущей датой).
3. Старые архивы можно автоматически удалять, чтобы не засорять место на сервере.

WP-Cron запускается каждый раз, когда кто-то посещает сайт, но для серверов с низким трафиком рекомендуется настроить системный cron для вызова WP-Cron.

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

Ниже пример плагина, который создаёт архив папки wp-content/uploads и сохраняет его в wp-content/backups. В архив включены только медиафайлы, но вы можете расширить фильтр.

<?php
/**
 * Plugin Name: WPUpload Backup
 * Description: Автоматический резервный копировщик файлов wp-content/uploads
 * Version: 1.0
 * Author: WPUpload.ru
 */

// Создаем расписание при активации плагина
function wpupload_backup_activation() {
    if (!wp_next_scheduled('wpupload_backup_event')) {
        wp_schedule_event(time(), 'daily', 'wpupload_backup_event');
    }
}
register_activation_hook(__FILE__, 'wpupload_backup_activation');

// Удаляем расписание при деактивации
function wpupload_backup_deactivation() {
    wp_clear_scheduled_hook('wpupload_backup_event');
}
register_deactivation_hook(__FILE__, 'wpupload_backup_deactivation');

// Основная функция резервного копирования
function wpupload_do_backup() {
    $upload_dir = wp_upload_dir();
    $source = $upload_dir['basedir'];
    $backup_dir = WP_CONTENT_DIR . '/backups';

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

    $date = date('Y-m-d_H-i-s');
    $archive_file = $backup_dir . '/backup_' . $date . '.zip';

    $zip = new ZipArchive();
    if ($zip->open($archive_file, ZipArchive::CREATE) !== TRUE) {
        error_log('WPUpload Backup: Не удалось создать архив');
        return;
    }

    $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);

            // Можно добавить фильтр по расширениям, например только изображения
            $allowed_ext = array('jpg', 'jpeg', 'png', 'gif', 'pdf', 'mp4', 'webm');
            $ext = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
            if (in_array($ext, $allowed_ext)) {
                $zip->addFile($filePath, $relativePath);
            }
        }
    }
    $zip->close();

    // Удаляем архивы старше 30 дней
    wpupload_cleanup_old_backups($backup_dir, 30);
}
add_action('wpupload_backup_event', 'wpupload_do_backup');

// Функция очистки старых бэкапов
function wpupload_cleanup_old_backups($dir, $days = 30) {
    $files = glob($dir . '/backup_*.zip');
    $now = time();
    foreach ($files as $file) {
        if (is_file($file)) {
            if ($now - filemtime($file) >= ($days * 86400)) {
                unlink($file);
            }
        }
    }
}
?>

Как расширить функционал резервного копировщика

Добавление уведомлений по email

Чтобы быть в курсе успешных или неудачных резервных копий, можно добавить отправку email администратору:

function wpupload_do_backup() {
    // ... существующий код архивации

    if ($zip->status === ZIPARCHIVE::ER_OK) {
        wp_mail(get_option('admin_email'), 'Резервное копирование WordPress', 'Резервная копия создана: ' . $archive_file);
    } else {
        wp_mail(get_option('admin_email'), 'Ошибка резервного копирования WordPress', 'Не удалось создать резервную копию.');
    }
}

Бэкап базы данных вместе с файлами

Для полного восстановления полезно сохранять базу данных. Пример функции для экспорта SQL:

function wpupload_backup_database($backup_dir) {
    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) {
            $vals = array_map(array($wpdb, 'escape'), array_values($row));
            $vals = array_map(function($v) { return "'" . $v . "'"; }, $vals);
            $sql_dump .= "INSERT INTO `" . $table_name . "` VALUES (" . implode(",", $vals) . ");\n";
        }
        $sql_dump .= "\n";
    }

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

Рекомендации и лучшие практики для бэкапов в WordPress

1. Храните бэкапы вне корневой папки сайта или на внешних ресурсах (облачное хранилище, FTP, Dropbox). Это повысит безопасность.

2. Регулярно проверяйте целостность и возможность восстановления из бэкапов.

3. Используйте системный cron для запуска WP-Cron на серверах с низким трафиком.

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

5. Рассмотрите использование готовых решений, если не хотите заниматься поддержкой собственного кода.

Полезные плагины для резервного копирования с расширением возможностей

Кроме собственного кода, рекомендуем обратить внимание на плагины из WPShop.ru:

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

Эти плагины можно интегрировать с вашим бэкап-решением для расширения функционала.

Как установить ограничение на размер файлов в WordPress при загрузке
10.01.2026
Как удалить загруженные файлы из WooCommerce после отмены заказа
14.05.2026
Как автоматически удалять файлы WooCommerce после отмены заказа без плагинов
25.05.2026
Как удалить загруженные файлы из WooCommerce после отмены заказа
07.05.2026
Система отложенной загрузки файлов в WordPress: подробное руководство
30.03.2026

wp upload - это директория в WP для загрузки файлов. Подробнее про загрузку файлов в админку можно почитать на этой странице.