Резервное копирование сайта на WordPress — важнейшая часть поддержания стабильности и безопасности вашего проекта. Несмотря на множество готовых плагинов для бэкапов, иногда требуется собственное, гибко настраиваемое решение. В этой статье мы подробно разберём, как создать резервную копию WordPress с помощью PHP скрипта, который можно запускать вручную или по расписанию через cron.
Зачем создавать резервные копии вручную и писать собственные скрипты
Плагины вроде UpdraftPlus или BackWPup отлично справляются с задачей, но у них есть ограничения: частота создания копий, формат архива, место хранения и т.д. Автоматизация через собственный PHP скрипт даст вам полный контроль над процессом, позволит интегрировать копирование в существующую инфраструктуру и избежать проблем с совместимостью.
Кроме того, написание собственного скрипта — хороший способ глубже понять структуру WordPress и научиться работать с файловой системой и базой данных на уровне PHP.
В итоге вы получаете:
- Резервное копирование базы данных и файлов сайта;
- Архивацию копий в zip-формате;
- Хранение бэкапов в выбранной папке;
- Возможность запускать скрипт из командной строки или через браузер.
Что нужно для создания резервной копии WordPress
Резервная копия WordPress состоит из двух основных частей:
- Файлы сайта — тема, плагины, загрузки, ядро;
- База данных MySQL — содержит контент, настройки, пользователей.
Для автоматизации нам понадобится:
- Доступ к файловой системе сайта;
- Данные для подключения к базе данных (обычно из
wp-config.php); - Библиотека для создания архивов (например, встроенный в PHP класс
ZipArchive).
Получение настроек из wp-config.php
Чтобы не дублировать данные подключения к базе, мы можем подключить wp-config.php и использовать константы:
require_once __DIR__ . '/wp-config.php';
$db_host = DB_HOST;
$db_name = DB_NAME;
$db_user = DB_USER;
$db_password = DB_PASSWORD;Это позволяет автоматически синхронизировать скрипт с текущими настройками WordPress.
Пример PHP скрипта для резервного копирования WordPress
Ниже пример простого скрипта, который создаёт архив с файлами и дамп базы данных.
<?php
// Подключаем настройки WordPress
require_once __DIR__ . '/wp-config.php';
// Настройки
$backupDir = __DIR__ . '/backups';
if (!is_dir($backupDir)) {
mkdir($backupDir, 0755, true);
}
$date = date('Y-m-d_H-i-s');
$backupFile = $backupDir . "/wpzen_backup_{$date}.zip";
// Создаем дамп базы данных
function wpzen_create_db_dump($host, $user, $pass, $dbname, $dumpPath) {
$command = "mysqldump --host={$host} --user={$user} --password={$pass} {$dbname} > {$dumpPath}";
system($command, $return_var);
return $return_var === 0;
}
$dbDumpPath = $backupDir . "/db_backup_{$date}.sql";
if (!wpzen_create_db_dump(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, $dbDumpPath)) {
die('Ошибка при создании дампа базы данных');
}
// Создаем архив с файлами и дампом
$zip = new ZipArchive();
if ($zip->open($backupFile, ZipArchive::CREATE) !== true) {
die('Не удалось создать архив');
}
// Рекурсивная функция для добавления файлов в архив
function wpzen_add_folder_to_zip($folder, $zip, $localPath = '') {
$handle = opendir($folder);
while (($file = readdir($handle)) !== false) {
if ($file === '.' || $file === '..' || $file === 'backups') continue;
$filePath = $folder . '/' . $file;
$localName = ltrim($localPath . '/' . $file, '/');
if (is_dir($filePath)) {
wpzen_add_folder_to_zip($filePath, $zip, $localName);
} else {
$zip->addFile($filePath, $localName);
}
}
closedir($handle);
}
// Добавляем все файлы сайта кроме папки с бэкапами
wpzen_add_folder_to_zip(__DIR__, $zip);
// Добавляем дамп базы
$zip->addFile($dbDumpPath, basename($dbDumpPath));
$zip->close();
// Удаляем временный дамп
unlink($dbDumpPath);
echo "Резервная копия успешно создана: {$backupFile}";
?>Этот скрипт создаст папку backups в корне сайта, сделает SQL дамп базы, затем запишет в архив все файлы сайта, кроме самой папки с бэкапами.
Запуск скрипта и автоматизация через cron
Скрипт можно запускать вручную через браузер (если есть доступ) или из командной строки:
php /path/to/wpzen_backup.phpДля автоматизации добавьте задание в cron, например, для ежедневного запуска в 3 часа ночи:
0 3 * * * /usr/bin/php /path/to/wpzen_backup.php >/dev/null 2>&1Убедитесь, что права доступа к папке backups позволяют веб-серверу или пользователю cron создавать и читать файлы.
Безопасность и хранение резервных копий
Очень важно хранить резервные копии в безопасном месте. Если возможно, перенесите папку с бэкапами за пределы публичного веб-каталога, чтобы их нельзя было скачать напрямую.
Еще один вариант — настроить выгрузку созданных архивов на удалённый сервер или в облачное хранилище (например, Amazon S3) с помощью дополнительных скриптов.
Также рекомендуем ограничить доступ к скрипту резервного копирования, например, по IP или с помощью простой базовой аутентификации, чтобы никто посторонний не мог инициировать бэкап вручную.
Заключение
Создание собственного PHP скрипта для резервного копирования WordPress — отличный способ контролировать процесс, глубже понять устройство сайта и обезопасить проект. Приведённый пример можно дополнить дополнительными функциями, например, отправкой уведомлений на почту, удалением старых копий или интеграцией с другими сервисами.
Если у вас есть вопросы по коду или вы хотите расширить функциональность — пишите, разберём вместе.