Резервное копирование — одна из важнейших задач при управлении сайтом на WordPress. Многие пользователи полагаются на плагины, но иногда хочется обойтись без них, чтобы снизить нагрузку на сайт и иметь полный контроль над процессом. В этой статье мы разберём, как создать автоматический бэкап WordPress, используя собственный PHP-скрипт и CRON-задачи на сервере, без установки дополнительных плагинов.
Почему стоит создавать бэкап без плагинов
Плагины для резервного копирования удобны, но они:
- Могут замедлять работу сайта, особенно при больших объёмах данных;
- Иногда конфликтуют с другими плагинами или темами;
- Не всегда дают полный контроль над процессом и местом хранения копий;
- Зависимы от обновлений и поддержки разработчиков.
Используя свой скрипт, вы сможете гибко настраивать процесс, хранить бэкапы там, где удобно, и интегрировать с серверными CRON-задачами для полной автоматизации.
Основные компоненты резервного копирования WordPress
Чтобы сделать полноценный бэкап, нужно сохранять:
- Базу данных MySQL — все записи, настройки, контент;
- Файлы сайта — темы, плагины, загрузки и системные файлы.
Приведённый ниже пример создаст архив с файлами и дамп базы данных, сохраняя их в указанной папке.
Создание дампа базы данных
Для экспорта базы данных можно использовать функцию mysqldump или подключиться к базе через PHP и выгрузить данные. В целях простоты и производительности используем системную команду mysqldump. Например:
mysqldump -u DB_USER -pDB_PASSWORD DB_NAME > /path/to/backup/db_backup.sqlВ PHP это можно реализовать так:
function wphow_backup_create_db_dump() {
$db_user = DB_USER;
$db_password = DB_PASSWORD;
$db_name = DB_NAME;
$backup_dir = __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';
$command = "mysqldump -u $db_user -p$db_password $db_name > $filename";
exec($command, $output, $return_var);
if ($return_var !== 0) {
error_log('WPHow: Ошибка создания дампа базы данных');
}
return $filename;
}Обратите внимание, что команда mysqldump должна быть доступна на сервере, а права пользователя — достаточны для выполнения дампа.
Архивирование файлов сайта
Для создания архива файлов используем встроенный класс ZipArchive в PHP. Ниже пример функции, которая добавляет все файлы из корня сайта в ZIP-архив:
function wphow_backup_create_files_zip() {
$root_path = ABSPATH; // Корневая папка WordPress
$backup_dir = __DIR__ . '/backups';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
$zip_filename = $backup_dir . '/files_backup_' . date('Y-m-d_H-i-s') . '.zip';
$zip = new ZipArchive();
if ($zip->open($zip_filename, ZipArchive::CREATE) !== TRUE) {
error_log('WPHow: Не удалось создать ZIP-архив');
return false;
}
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root_path),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($root_path));
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
return $zip_filename;
}Эта функция создаст архив с актуальной датой и временем, включающий все файлы WordPress.
Автоматизация процесса через CRON
Чтобы бэкап создавался автоматически, нужно добавить задачу в CRON на сервере. Для этого:
- Создайте PHP-скрипт
backup.phpв корне сайта, который вызывает функции бэкапа и сохраняет результаты; - Добавьте задание в CRON, которое будет запускать этот скрипт с нужной периодичностью.
Пример backup.php:
<?php
// Загрузка WordPress для доступа к константам и функциям
require_once(__DIR__ . '/wp-load.php');
$db_backup = wphow_backup_create_db_dump();
$files_backup = wphow_backup_create_files_zip();
// Логирование результатов
error_log("WPHow: Бэкап базы данных создан: $db_backup");
error_log("WPHow: Бэкап файлов создан: $files_backup");Добавление задачи в CRON (пример для запуска ежедневно в 3:00 по серверному времени):
0 3 * * * /usr/bin/php /path/to/your/wordpress/backup.phpПуть к PHP и скрипту замените на актуальные для вашего сервера.
Дополнительные рекомендации и безопасность
Хранение бэкапов
Не храните резервные копии в общедоступных папках сайта — создайте отдельную директорию вне корня веб-сервера или защитите папку .htaccess. Это предотвратит доступ посторонних к вашим бэкапам.
Очистка старых бэкапов
Чтобы не занимать слишком много места, добавьте в backup.php функцию удаления файлов старше определённого времени (например, 30 дней):
function wphow_backup_clear_old($backup_dir, $days = 30) {
$files = glob($backup_dir . '/*');
$now = time();
foreach ($files as $file) {
if (is_file($file) && ($now - filemtime($file)) >= 60 * 60 * 24 * $days) {
unlink($file);
}
}
}Вызовите её в конце скрипта:
wphow_backup_clear_old(__DIR__ . '/backups');Безопасность доступа
Если вы планируете запускать бэкап скрипт через веб-запрос, обязательно добавьте проверку секретного ключа или IP, чтобы никто посторонний не мог запустить процесс. В случае CRON это не требуется, так как скрипт запускается локально.
Альтернативные варианты без плагинов
Если у вас нет доступа к CRON или mysqldump, можно создать PHP-скрипт с использованием функций mysqli для выгрузки базы. Но это менее эффективно и может нагружать сервер.
Также можно настроить автоматическое копирование файлов и базы через SSH-скрипты, если у вас есть доступ к серверу.
Выводы
Создание автоматических резервных копий WordPress без плагинов — вполне реальная задача, которая даёт полную свободу и контроль. Используя системные инструменты и PHP, вы можете легко настроить надёжный и безопасный механизм бэкапа, адаптированный под ваши нужды. Главное — не забывать регулярно проверять работоспособность и хранить копии в безопасном месте.