Резервное копирование — это одна из самых важных процедур для любого сайта на WordPress. Большинство пользователей полагаются на плагины для создания бэкапов, однако есть ситуации, когда использование плагина нежелательно или невозможно: например, на хостинге с ограничениями или с целью снижения нагрузки. В этой статье мы подробно разберем, как настроить автоматическое создание резервных копий WordPress без плагинов, используя стандартные инструменты PHP и cron.
Почему важно делать резервные копии WordPress?
Резервное копирование защищает сайт от потери данных из-за взлома, ошибок при обновлении, сбоя хостинга или случайного удаления файлов и базы данных. В идеале, бэкапы должны включать:
- Файлы сайта — темы, плагины, медиафайлы;
- Базу данных — все записи, страницы, настройки;
- Хранение копий в безопасном месте — удаленный сервер, облако, локальный компьютер.
Без регулярных резервных копий восстановление сайта может стать крайне сложной и дорогой задачей.
Основные подходы к резервному копированию без плагинов
Чтобы сделать резервные копии WordPress без плагинов, нужно автоматизировать две задачи:
- Экспорт файлов сайта в архив;
- Экспорт базы данных в SQL-файл.
Для автоматизации мы воспользуемся PHP-скриптом, который будет запускаться по расписанию через cron на сервере. Ниже мы подробно рассмотрим оба шага и приведем пример готового скрипта.
Архивирование файлов WordPress с помощью PHP
Для архивации файлов можно использовать класс ZipArchive, встроенный в PHP (убедитесь, что он включен на вашем сервере).
Основная идея — пройтись рекурсивно по папке сайта и добавить все файлы в zip-архив.
Вот пример функции для архивации каталога:
function wplearn_zipDirectory($source, $destination) {
if (!extension_loaded('zip') || !file_exists($source)) {
return false;
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
return false;
}
$source = realpath($source);
if (is_dir($source)) {
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($source),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($source) + 1);
$zip->addFile($filePath, $relativePath);
}
}
} else if (is_file($source)) {
$zip->addFile($source, basename($source));
}
return $zip->close();
}
Эта функция создаст zip-архив с полным содержимым каталога WordPress.
Экспорт базы данных WordPress в SQL-файл
Для создания дампа базы данных можно использовать встроенную функцию mysqldump, если есть доступ к командной строке, или написать PHP-функцию, которая экспортирует таблицы вручную. Рассмотрим простой способ через PHP с использованием объекта PDO или mysqli.
Ниже пример функции, которая экспортирует всю базу данных в файл:
function wplearn_exportDatabase($host, $user, $pass, $dbname, $outputFile) {
$mysqli = new mysqli($host, $user, $pass, $dbname);
if ($mysqli->connect_error) {
return false;
}
$mysqli->set_charset('utf8');
$tables = [];
$result = $mysqli->query('SHOW TABLES');
while ($row = $result->fetch_array()) {
$tables[] = $row[0];
}
$sqlDump = '';
foreach ($tables as $table) {
// Создаем DROP TABLE
$sqlDump .= "DROP TABLE IF EXISTS `$table`;
";
// Создаем CREATE TABLE
$row2 = $mysqli->query("SHOW CREATE TABLE `$table`")->fetch_assoc();
$sqlDump .= $row2['Create Table'] . ";
";
// Вставляем данные
$result2 = $mysqli->query("SELECT * FROM `$table`");
$columnCount = $result2->field_count;
while ($rowData = $result2->fetch_row()) {
$sqlDump .= "INSERT INTO `$table` VALUES(";
$valuesArr = [];
foreach ($rowData as $value) {
if (is_null($value)) {
$valuesArr[] = 'NULL';
} else {
$valuesArr[] = "'" . $mysqli->real_escape_string($value) . "'";
}
}
$sqlDump .= implode(',', $valuesArr) . ");
";
}
$sqlDump .= "
";
}
file_put_contents($outputFile, $sqlDump);
$mysqli->close();
return true;
}
Обратите внимание, что для больших баз данных такой метод может быть медленным и требовать увеличения лимитов памяти и времени выполнения скрипта.
Полный пример скрипта для резервного копирования WordPress
Объединим наши функции в один скрипт, который создаст архив файлов и дамп базы, а затем сохранит их в папке wp-content/backups.
define('WPLEARN_BACKUP_DIR', __DIR__ . '/wp-content/backups');
if (!file_exists(WPLEARN_BACKUP_DIR)) {
mkdir(WPLEARN_BACKUP_DIR, 0755, true);
}
$date = date('Y-m-d_H-i-s');
$zipFile = WPLEARN_BACKUP_DIR . "/wplearn-backup-files-{$date}.zip";
$sqlFile = WPLEARN_BACKUP_DIR . "/wplearn-backup-db-{$date}.sql";
// Архивируем файлы
$filesBackup = wplearn_zipDirectory(__DIR__, $zipFile);
// Получаем данные для подключения из wp-config.php
require_once __DIR__ . '/wp-config.php';
db_user = defined('DB_USER') ? DB_USER : '';
db_password = defined('DB_PASSWORD') ? DB_PASSWORD : '';
db_name = defined('DB_NAME') ? DB_NAME : '';
db_host = defined('DB_HOST') ? DB_HOST : '';
// Экспорт базы данных
$dbBackup = wplearn_exportDatabase(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, $sqlFile);
if ($filesBackup && $dbBackup) {
echo "Резервное копирование завершено успешно.\nФайлы: $zipFile\nБаза данных: $sqlFile";
} else {
echo "Ошибка при создании резервной копии.";
}
// Функции wplearn_zipDirectory и wplearn_exportDatabase из предыдущих примеров
Этот скрипт можно сохранить в корне сайта, например, как backup.php, и запускать по расписанию через cron.
Настройка cron для автоматического запуска резервного копирования
Чтобы автоматизировать запуск скрипта, добавьте в cron следующую строку (пример для запуска ежедневно в 3 часа ночи):
0 3 * * * /usr/bin/php /path/to/your/site/backup.php > /dev/null 2>&1
Обязательно укажите правильный путь к PHP и к вашему скрипту. Вывод перенаправляется в null, чтобы не засорять почту сервера.
Дополнительные рекомендации и безопасность
1. Резервные копии могут занимать много места, регулярно очищайте старые архивы.
2. Храните копии вне корня сайта, например, на другом сервере или в облаке.
3. Для защиты скрипта backup.php ограничьте доступ по IP или защитите паролем.
4. Для больших сайтов рекомендуем использовать более профессиональные решения или плагины с оптимизацией.
Вывод
Создание автоматических резервных копий WordPress без плагинов — вполне выполнимая задача, особенно если вы хотите контролировать процесс и минимизировать сторонние зависимости. Используя PHP и cron, можно организовать надежное резервное копирование как файлов, так и базы данных с минимальными усилиями.