Как создать автоматический резервный копировщик файлов 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
13.12.2025
Удаление неиспользуемых файлов в медиабиблиотеке WordPress без плагинов
04.07.2026
Как использовать фильтры для оптимизации загрузки файлов в WordPress
05.12.2025
Как защитить WooCommerce от нежелательных загрузок файлов
27.06.2026
Как автоматизировать удаление старых файлов в WordPress: практические решения для WPUpload
27.11.2025

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