wpcat.ru wordpress WPCat.ru

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

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

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

Автоматизация резервного копирования через плагины — это удобно, но иногда такие решения могут:

  • замедлять работу сайта;
  • создавать потенциальные уязвимости;
  • занимать лишнее место, если не настроены правильно;
  • зависеть от обновлений самого плагина.

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

Кроме того, вы сможете интегрировать автоматическое копирование с системным cron, чтобы не запускать процесс вручную.

Основные составляющие резервной копии WordPress

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

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

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

Как создать резервную копию файлов WordPress через PHP

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

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

function wpcat_create_backup_files($source_dir, $backup_dir) {
    $zip = new ZipArchive();
    $backup_file = $backup_dir . '/wpcat-backup-files-' . date('Y-m-d_H-i-s') . '.zip';

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

    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($source_dir),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $name => $file) {
        if (!$file->isDir()) {
            $filePath = $file->getRealPath();
            // Пропускаем папку резервных копий
            if (strpos($filePath, $backup_dir) === 0) {
                continue;
            }
            $relativePath = substr($filePath, strlen($source_dir) + 1);
            $zip->addFile($filePath, $relativePath);
        }
    }

    $zip->close();
    return $backup_file;
}

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

$site_root = ABSPATH; // константа WordPress с корнем установки
$backup_folder = ABSPATH . 'wp-content/backups';

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

$file_backup = wpcat_create_backup_files($site_root, $backup_folder);
if ($file_backup) {
    echo 'Резервная копия файлов создана: ' . $file_backup;
} else {
    echo 'Ошибка при создании резервной копии файлов';
}

Как экспортировать базу данных WordPress с помощью PHP

Экспорт базы данных можно сделать с помощью команды mysqldump, если есть доступ к консоли, или через PHP-скрипт, который создаст дамп SQL вручную.

Рассмотрим вариант с PHP, используя класс wpcat_export_database_dump(). Эта функция подключается к базе данных WordPress и экспортирует структуру и данные всех таблиц с префиксом.

function wpcat_export_database_dump($backup_dir) {
    global $wpdb;

    $tables = $wpdb->get_results('SHOW TABLES LIKE "' . $wpdb->prefix . '%"', ARRAY_N);
    if (!$tables) {
        return false;
    }

    $dump = '';

    foreach ($tables as $table) {
        $table_name = $table[0];
        // Получаем структуру таблицы
        $create_table = $wpdb->get_row("SHOW CREATE TABLE $table_name", ARRAY_N);
        $dump .= "DROP TABLE IF EXISTS `$table_name`;\n";
        $dump .= $create_table[1] . ";\n\n";

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

    $backup_file = $backup_dir . '/wpcat-backup-db-' . date('Y-m-d_H-i-s') . '.sql';
    file_put_contents($backup_file, $dump);

    return $backup_file;
}

Эта функция создаст SQL-файл с дампом базы данных. Для вызова и проверки:

$db_backup = wpcat_export_database_dump($backup_folder);
if ($db_backup) {
    echo 'Резервная копия базы данных создана: ' . $db_backup;
} else {
    echo 'Ошибка при создании резервной копии базы данных';
}

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

Для автоматизации процесса удобно настроить системный cron на сервере. Он будет запускать PHP-скрипт с нашими функциями по расписанию (например, раз в сутки).

Создайте файл backup-wpcat.php в корне сайта с таким содержимым:

<?php

require_once 'wp-load.php';

$backup_folder = ABSPATH . 'wp-content/backups';
if (!file_exists($backup_folder)) {
    mkdir($backup_folder, 0755, true);
}

$file_backup = wpcat_create_backup_files(ABSPATH, $backup_folder);
$db_backup = wpcat_export_database_dump($backup_folder);

// Можно здесь добавить логи или отправку уведомлений по email

?>

Далее добавьте в cron задачу, которая будет запускать этот скрипт, например, командой:

0 3 * * * /usr/bin/php /путь/к/вашему/сайту/backup-wpcat.php

Это запустит резервное копирование каждый день в 3 часа ночи.

Дополнительные советы и рекомендации

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

Чтобы не переполнять диск, полезно автоматически удалять копии старше определённого времени. Добавьте в ваш скрипт функцию, которая удалит архивы старше, например, 14 дней:

function wpcat_cleanup_old_backups($backup_dir, $days = 14) {
    $files = glob($backup_dir . '/*');
    $now = time();
    foreach ($files as $file) {
        if (is_file($file) && $now - filemtime($file) > $days * 86400) {
            unlink($file);
        }
    }
}

Вызовите её в начале или конце скрипта резервного копирования:

wpcat_cleanup_old_backups($backup_folder);

Безопасность хранения резервных копий

Резервные копии содержат все данные сайта, поэтому важно хранить их в недоступном для веба месте или защитить паролем. Можно переместить папку wp-content/backups выше корня сайта или настроить .htaccess на запрет доступа.

Интеграция с WPGPT и Clearfy Pro

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

Заключение

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

×
День SEO
Время сделать подарок своему WordPress!
-20% на премиум

шаблоны и плагины

Порадуй свой сайт ⋙