Резервное копирование — обязательный элемент любой стратегии безопасности сайта на WordPress. Обычно для этого используют плагины, но иногда их установка нежелательна или невозможна, например, из-за ограничений хостинга или желания уменьшить нагрузку. В этой статье расскажу, как настроить автоматическое резервное копирование WordPress без плагинов, используя PHP-скрипты и планировщик задач Cron.
Зачем делать резервное копирование WordPress без плагинов
Плагины резервного копирования удобны и функциональны, но имеют несколько недостатков:
- Загрузка сервера и увеличение времени отклика сайта.
- Зависимость от стороннего кода и обновлений.
- Ограничения на хостинге, где запрещена установка некоторых плагинов.
Создавая собственное решение, вы получаете контроль и легковесность, а также возможность гибко настраивать процесс под свои задачи.
Что нужно для резервного копирования WordPress
Для полноценного бэкапа важно сохранить две основные части:
- Файлы сайта — темы, плагины, медиа и т.д.
- Базу данных — все записи, настройки, контент.
Далее разберём, как сделать резервное копирование каждого компонента и объединить их в один архив.
Создание PHP-скрипта для резервного копирования файлов и базы данных
Ниже представлен пример простого скрипта, который создаёт дамп базы данных и архивирует файлы сайта в zip-архив.
<?php
// Настройки подключения к базе данных
$db_host = 'localhost';
$db_name = 'your_db_name';
$db_user = 'your_db_user';
$db_pass = 'your_db_password';
// Пути
$backup_dir = __DIR__ . '/wp-backups';
$backup_date = date('Y-m-d_H-i-s');
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
// Файл для дампа базы
$sql_file = "$backup_dir/db-backup-$backup_date.sql";
// Функция для создания дампа базы (mysqldump должен быть доступен)
function wpbox_create_db_backup($db_host, $db_user, $db_pass, $db_name, $sql_file) {
$command = "mysqldump --host=$db_host --user=$db_user --password=$db_pass $db_name > $sql_file";
system($command, $output);
return file_exists($sql_file);
}
// Создаём дамп базы
if (!wpbox_create_db_backup($db_host, $db_user, $db_pass, $db_name, $sql_file)) {
die('Ошибка создания дампа базы данных');
}
// Создаём zip-архив с файлами сайта и дампом
$zip_file = "$backup_dir/wp-backup-$backup_date.zip";
$zip = new ZipArchive();
if ($zip->open($zip_file, ZipArchive::CREATE) !== TRUE) {
die('Не удалось создать zip архив');
}
// Добавляем файлы сайта
function wpbox_add_folder_to_zip($folder, $zip, $baseFolder) {
$files = scandir($folder);
foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;
$filePath = "$folder/$file";
$localPath = substr($filePath, strlen($baseFolder) + 1);
if (is_dir($filePath)) {
wpbox_add_folder_to_zip($filePath, $zip, $baseFolder);
} else {
$zip->addFile($filePath, $localPath);
}
}
}
$site_root = __DIR__; // Корень сайта
wpbox_add_folder_to_zip($site_root, $zip, $site_root);
// Добавляем дамп базы в архив
$zip->addFile($sql_file, basename($sql_file));
$zip->close();
// Удаляем временный файл дампа
unlink($sql_file);
echo "Резервное копирование успешно создано: $zip_file";
?>
Этот скрипт следует сохранить, например, как backup.php в корне сайта.
Настройка автоматического запуска с помощью Cron
Для автоматизации нужно добавить задачу в Cron, которая будет запускать скрипт по расписанию. Например, для ежедневного запуска в 3 часа ночи:
0 3 * * * /usr/bin/php /path/to/your/site/backup.php >/dev/null 2>&1
Обязательно укажите полный путь до PHP и скрипта. Если у вашего хостинга есть панель управления, настройка Cron обычно доступна в разделе «Задачи Cron».
Дополнительные рекомендации и улучшения
Отправка архива на удалённый сервер или облако
Чтобы повысить надёжность, можно настроить отправку созданного архива на удалённый FTP, SFTP-сервер или в облачное хранилище (Google Drive, Dropbox) с помощью соответствующих библиотек или утилит командной строки.
Ограничение количества хранимых резервных копий
Для экономии места на диске имеет смысл удалять старые архивы. Например, можно добавить в скрипт функцию удаления файлов старше 30 дней:
function wpbox_cleanup_old_backups($backup_dir, $days = 30) {
$files = glob("$backup_dir/*.zip");
$now = time();
foreach ($files as $file) {
if ($now - filemtime($file) >= 60 * 60 * 24 * $days) {
unlink($file);
}
}
}
И вызвать её в конце скрипта:
wpbox_cleanup_old_backups($backup_dir);
Безопасность
Резервные копии содержат всю информацию сайта, поэтому доступ к скрипту должен быть ограничен. Лучше запускать его только через Cron и не делать доступным из браузера. Например, защитить .htaccess или поместить скрипт вне веб-доступа.
Использование плагинов WPShop для резервного копирования
Если всё же захотите использовать плагин, обратите внимание на Clearfy Pro — в нем есть опции для оптимизации и некоторых резервных функций. Но для полного контроля и минимальной нагрузки вышеописанный метод будет предпочтительнее.
Итоги
Создание собственного автоматического резервного копирования WordPress без плагинов — задача вполне решаемая и очень полезная. Вы получаете лёгкое, гибкое и надёжное решение, контролируете процесс и не зависите от сторонних компонентов. Главное — правильно настроить скрипт, Cron и обеспечить безопасность. Надеюсь, пример кода и советы помогут вам реализовать такую систему на своём сайте.