Автоматическое создание резервных копий сайта — один из важнейших аспектов поддержки WordPress-проекта. Многие владельцы сайтов предпочитают использовать плагины, однако они не всегда подходят по разным причинам: избыточная нагрузка, несовместимость или ограничения хостинга. В этой статье мы подробно разберём, как создать автоматический бэкап WordPress без использования плагинов, используя стандартные средства PHP и системные задачи cron.
Зачем нужны автоматические резервные копии WordPress
Резервные копии позволяют быстро восстановить сайт при сбоях, ошибках обновлений, взломах или случайных удалениях. Автоматизация процесса исключает человеческий фактор и гарантирует регулярность создания бэкапов. В идеале в бэкапе должны присутствовать файлы сайта и база данных.
Без автоматизации владелец сайта рискует потерять важную информацию и тратить много времени на восстановление. Поэтому задача — реализовать простой, но надёжный механизм резервного копирования средствами сервера.
Создание скрипта резервного копирования базы данных WordPress
Первый шаг — резервное копирование базы данных MySQL. Для этого можно использовать встроенную утилиту mysqldump, но не всегда есть доступ к консоли. Рассмотрим вариант с PHP-скриптом, который экспортирует базу в SQL-файл.
<?php
// Конфигурация подключения к БД
$db_host = 'localhost';
$db_name = 'wp_database';
$db_user = 'wp_user';
$db_password = 'wp_password';
// Имя файла с датой
$backup_file = __DIR__ . '/backups/db_backup_' . date('Y-m-d_H-i-s') . '.sql';
// Функция для создания дампа базы
function wpmark_create_db_backup($host, $user, $pass, $dbname, $file) {
$mysqli = new mysqli($host, $user, $pass, $dbname);
if ($mysqli->connect_error) {
die('Ошибка подключения к БД: ' . $mysqli->connect_error);
}
$tables = [];
$result = $mysqli->query('SHOW TABLES');
while ($row = $result->fetch_array()) {
$tables[] = $row[0];
}
$sql = '';
foreach ($tables as $table) {
$result = $mysqli->query("SHOW CREATE TABLE `" . $table . "`");
$row = $result->fetch_assoc();
$sql .= "DROP TABLE IF EXISTS `" . $table . "`;
";
$sql .= $row['Create Table'] . ";
";
$result = $mysqli->query("SELECT * FROM `" . $table . "`");
while ($row = $result->fetch_assoc()) {
$columns = array_map(function($col) use ($mysqli) {
return '`' . $mysqli->real_escape_string($col) . '`';
}, array_keys($row));
$values = array_map(function($val) use ($mysqli) {
if ($val === null) return 'NULL';
return "'" . $mysqli->real_escape_string($val) . "'";
}, array_values($row));
$sql .= "INSERT INTO `" . $table . "` (" . implode(',', $columns) . ") VALUES (" . implode(',', $values) . ");
";
}
$sql .= "
";
}
file_put_contents($file, $sql);
$mysqli->close();
}
wpmark_create_db_backup($db_host, $db_user, $db_password, $db_name, $backup_file);
?>
Данный скрипт создаёт дамп всей базы в папку backups с текущей датой и временем. Убедитесь, что папка существует и доступна для записи.
Архивирование файлов WordPress с помощью PHP
Помимо базы, важно сохранить файлы сайта: темы, плагины, загрузки. Используем класс ZipArchive для создания архива всех файлов WordPress.
<?php
function wpmark_backup_wp_files($source_dir, $destination_zip) {
$zip = new ZipArchive();
if ($zip->open($destination_zip, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
die('Не удалось создать архив');
}
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($source_dir),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($source_dir) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
}
$source = __DIR__; // корень сайта
$dest = __DIR__ . '/backups/wp_files_backup_' . date('Y-m-d_H-i-s') . '.zip';
wpmark_backup_wp_files($source, $dest);
?>
Этот скрипт упаковывает все файлы сайта в архив ZIP. Для больших сайтов стоит исключить временные папки и кеш, чтобы не перегружать хранилище.
Настройка автоматического запуска скриптов резервного копирования через cron
Теперь, когда у нас есть PHP-скрипты для бэкапов базы и файлов, нужно настроить их автоматический запуск на сервере. Для этого используем планировщик задач cron.
1. Зайдите в панель управления хостингом или через SSH откройте crontab:
crontab -e
2. Добавьте строку для запуска скрипта, например, ежедневно в 3 часа ночи:
0 3 * * * /usr/bin/php /путь/к/вашему/backup_script.php >/dev/null 2>&1
3. Если база и файлы резервируются разными скриптами, добавьте обе команды.
Обязательно убедитесь, что PHP CLI доступен по указанному пути и скрипты имеют права на исполнение и запись файлов.
Рекомендации по хранению резервных копий
- Храните бэкапы вне корня сайта, чтобы они не удалялись при обновлениях.
- Регулярно переносите архивы на удалённый сервер или облако (например, с помощью rsync или scp).
- Контролируйте объём хранилища — удаляйте старые копии.
Пример интеграции с плагином WPRemark для уведомления о бэкапах
Если на сайте установлен плагин WPRemark, можно автоматически отправлять уведомления в комментарии или на почту после успешного создания резервной копии.
<?php
function wpmark_send_backup_notification($message) {
if (function_exists('wpremark_add_comment')) {
wpremark_add_comment('Резервное копирование', $message);
}
// Дополнительно: mail или другие уведомления
}
// В конце скрипта бэкапа вызываем
wpmark_send_backup_notification('Резервная копия базы и файлов успешно создана: ' . date('Y-m-d H:i:s'));
?>
Это позволит контролировать процесс резервного копирования без захода на сервер.