Резервное копирование сайта — одна из важнейших задач для любого администратора WordPress. Многие используют плагины, но иногда хочется обойтись без них — чтобы не нагружать систему, не создавать дополнительные зависимости и иметь полный контроль над процессом. В этой статье разберём, как реализовать автоматическое создание резервной копии WordPress вручную, используя возможности сервера, PHP и WordPress API.
Почему стоит делать резервное копирование вручную
Автоматизация резервного копирования через плагины — это удобно, но иногда такие решения могут:
- замедлять работу сайта;
- создавать потенциальные уязвимости;
- занимать лишнее место, если не настроены правильно;
- зависеть от обновлений самого плагина.
Собственная реализация даёт более гибкий и лёгкий в обслуживании инструмент, который можно адаптировать под свои нужды.
Кроме того, вы сможете интегрировать автоматическое копирование с системным cron, чтобы не запускать процесс вручную.
Основные составляющие резервной копии WordPress
Чтобы сделать полноценную резервную копию сайта, нужно сохранить две важные части:
- Файлы сайта — темы, плагины, медиа, конфигурационные файлы.
- Базу данных — все записи, страницы, настройки плагинов, пользовательские данные.
В нашей задаче нужно создать скрипт, который будет упаковывать эти данные в архив и сохранять его в безопасном месте.
Как создать резервную копию файлов WordPress через PHP
Для архивации файлов можно использовать встроенный класс ZipArchive в PHP. Он позволяет создавать ZIP-архивы и добавлять в них нужные файлы и папки.
Ниже пример функции, которая создаёт архив с корневой директорией WordPress, исключая папку с резервными копиями, чтобы не создавать рекурсивный архив:
function wpcat_create_backup_files($source_dir, $backup_dir) {
$zip = new ZipArchive();
$backup_file = $backup_dir . '/wpcat-backup-files-' . date('Y-m-d_H-i-s') . '.zip';
if ($zip->open($backup_file, ZipArchive::CREATE) !== TRUE) {
return false;
}
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($source_dir),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
// Пропускаем папку резервных копий
if (strpos($filePath, $backup_dir) === 0) {
continue;
}
$relativePath = substr($filePath, strlen($source_dir) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
return $backup_file;
}Эта функция создаёт ZIP-архив всех файлов сайта, кроме папки с резервными копиями. Для её работы нужно указать путь к корню сайта и папку для сохранения архивов, например:
$site_root = ABSPATH; // константа WordPress с корнем установки
$backup_folder = ABSPATH . 'wp-content/backups';
if (!file_exists($backup_folder)) {
mkdir($backup_folder, 0755, true);
}
$file_backup = wpcat_create_backup_files($site_root, $backup_folder);
if ($file_backup) {
echo 'Резервная копия файлов создана: ' . $file_backup;
} else {
echo 'Ошибка при создании резервной копии файлов';
}Как экспортировать базу данных WordPress с помощью PHP
Экспорт базы данных можно сделать с помощью команды mysqldump, если есть доступ к консоли, или через PHP-скрипт, который создаст дамп SQL вручную.
Рассмотрим вариант с PHP, используя класс wpcat_export_database_dump(). Эта функция подключается к базе данных WordPress и экспортирует структуру и данные всех таблиц с префиксом.
function wpcat_export_database_dump($backup_dir) {
global $wpdb;
$tables = $wpdb->get_results('SHOW TABLES LIKE "' . $wpdb->prefix . '%"', ARRAY_N);
if (!$tables) {
return false;
}
$dump = '';
foreach ($tables as $table) {
$table_name = $table[0];
// Получаем структуру таблицы
$create_table = $wpdb->get_row("SHOW CREATE TABLE $table_name", ARRAY_N);
$dump .= "DROP TABLE IF EXISTS `$table_name`;\n";
$dump .= $create_table[1] . ";\n\n";
// Получаем данные таблицы
$rows = $wpdb->get_results("SELECT * FROM $table_name", ARRAY_A);
foreach ($rows as $row) {
$values = array_map(function($value) use ($wpdb) {
if (is_null($value)) {
return 'NULL';
}
return "'" . esc_sql($value) . "'";
}, array_values($row));
$dump .= "INSERT INTO `$table_name` VALUES (" . implode(',', $values) . ");\n";
}
$dump .= "\n";
}
$backup_file = $backup_dir . '/wpcat-backup-db-' . date('Y-m-d_H-i-s') . '.sql';
file_put_contents($backup_file, $dump);
return $backup_file;
}Эта функция создаст SQL-файл с дампом базы данных. Для вызова и проверки:
$db_backup = wpcat_export_database_dump($backup_folder);
if ($db_backup) {
echo 'Резервная копия базы данных создана: ' . $db_backup;
} else {
echo 'Ошибка при создании резервной копии базы данных';
}Настройка автоматического запуска резервного копирования через Cron
Для автоматизации процесса удобно настроить системный cron на сервере. Он будет запускать PHP-скрипт с нашими функциями по расписанию (например, раз в сутки).
Создайте файл backup-wpcat.php в корне сайта с таким содержимым:
<?php
require_once 'wp-load.php';
$backup_folder = ABSPATH . 'wp-content/backups';
if (!file_exists($backup_folder)) {
mkdir($backup_folder, 0755, true);
}
$file_backup = wpcat_create_backup_files(ABSPATH, $backup_folder);
$db_backup = wpcat_export_database_dump($backup_folder);
// Можно здесь добавить логи или отправку уведомлений по email
?>Далее добавьте в cron задачу, которая будет запускать этот скрипт, например, командой:
0 3 * * * /usr/bin/php /путь/к/вашему/сайту/backup-wpcat.phpЭто запустит резервное копирование каждый день в 3 часа ночи.
Дополнительные советы и рекомендации
Очистка старых резервных копий
Чтобы не переполнять диск, полезно автоматически удалять копии старше определённого времени. Добавьте в ваш скрипт функцию, которая удалит архивы старше, например, 14 дней:
function wpcat_cleanup_old_backups($backup_dir, $days = 14) {
$files = glob($backup_dir . '/*');
$now = time();
foreach ($files as $file) {
if (is_file($file) && $now - filemtime($file) > $days * 86400) {
unlink($file);
}
}
}Вызовите её в начале или конце скрипта резервного копирования:
wpcat_cleanup_old_backups($backup_folder);Безопасность хранения резервных копий
Резервные копии содержат все данные сайта, поэтому важно хранить их в недоступном для веба месте или защитить паролем. Можно переместить папку wp-content/backups выше корня сайта или настроить .htaccess на запрет доступа.
Интеграция с WPGPT и Clearfy Pro
Если вы используете продукты с WPGPT или Clearfy Pro, вы можете дополнительно оптимизировать процесс резервного копирования, отключая ненужные функции и улучшая производительность сайта во время архивации.
Заключение
Создание автоматической резервной копии WordPress без плагинов — вполне решаемая задача, которая даст вам полный контроль над процессом и избавит от лишних зависимостей. Используя PHP и системный cron, вы сможете регулярно сохранять файлы и базу данных сайта в безопасном месте, минимизируя риски потери данных.