Резервное копирование сайта — неотъемлемая часть его безопасности и стабильности. Многие пользователи WordPress устанавливают плагины для автоматического создания бэкапов, но что делать, если вы хотите минимизировать количество плагинов, повысить контроль над процессом и создать собственное решение? В этой статье разберём, как создать автоматическое резервное копирование WordPress с помощью встроенных средств и небольшого кода.
Почему стоит создавать резервные копии вручную и без плагинов
Плагины удобны, но часто они потребляют ресурсы, имеют ограничения по количеству бэкапов, зависят от сторонних сервисов или не предоставляют гибкость в настройках. Собственное решение даст полный контроль, позволит интегрировать процесс в серверные задачи и настроить уведомления на почту или в админ-панель.
Кроме того, если вы работаете с ограниченным хостингом, где установка дополнительных плагинов нежелательна, такой подход будет оптимальным.
Также при создании резервной копии вручную вы можете исключить из неё ненужные папки, оптимизировать размер бэкапа и настроить хранение в удобном месте, например, на удалённом сервере или в облаке.
Основные компоненты резервного копирования WordPress
Резервная копия WordPress должна включать два основных компонента:
- Файлы сайта — все темы, плагины, загрузки и ядро WordPress;
- Базу данных — все записи, настройки, комментарии и контент.
Каждый компонент требует индивидуального подхода для копирования и восстановления.
Копирование файлов сайта
Для копирования файлов можно воспользоваться PHP-функциями для архивации. В качестве примера можно использовать класс ZipArchive, который создаст ZIP-архив с нужными файлами.
Важно исключить временные и системные папки, например, кеш, логи, чтобы не перегружать архив.
Экспорт базы данных
Для создания дампа базы данных можно воспользоваться командой mysqldump, если у вас есть доступ к командной строке, либо создать SQL-дамп с помощью PHP, выполняя запросы и записывая результат.
Пример кода для создания резервного копирования файлов и базы данных
Ниже пример функции wordpressy_create_backup(), которая:
- Создаёт ZIP-архив с файлами WordPress, исключая папки
wp-content/cacheиwp-content/uploads/cache; - Создаёт SQL-дамп базы данных;
- Сохраняет оба файла в папку
wp-content/backups.
function wordpressy_create_backup() {
$upload_dir = wp_upload_dir();
$backup_dir = WP_CONTENT_DIR . '/backups';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
$date = date('Y-m-d_H-i-s');
$zip_path = "$backup_dir/wordpress-files-$date.zip";
$sql_path = "$backup_dir/wordpress-db-$date.sql";
// Создаём ZIP архив с файлами
$zip = new ZipArchive();
if ($zip->open($zip_path, ZipArchive::CREATE) !== TRUE) {
error_log('Не удалось создать архив: ' . $zip_path);
return false;
}
$root = ABSPATH;
$exclude = ['wp-content/cache', 'wp-content/uploads/cache', 'wp-content/backups'];
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($root));
foreach ($files as $file) {
if (!$file->isFile()) continue;
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($root));
$skip = false;
foreach ($exclude as $excl) {
if (strpos($relativePath, $excl) === 0) {
$skip = true;
break;
}
}
if ($skip) continue;
$zip->addFile($filePath, $relativePath);
}
$zip->close();
// Создаём SQL дамп базы данных
global $wpdb;
$db_host = DB_HOST;
$db_name = DB_NAME;
$db_user = DB_USER;
$db_password = DB_PASSWORD;
$command = "mysqldump --user={$db_user} --password={$db_password} --host={$db_host} {$db_name} > {$sql_path}";
exec($command, $output, $return_var);
if ($return_var !== 0) {
error_log('Ошибка создания дампа базы данных');
return false;
}
return ['files_backup' => $zip_path, 'db_backup' => $sql_path];
}
Как автоматизировать резервное копирование с помощью WP-Cron
Чтобы запускать резервное копирование регулярно, используйте WP-Cron. В файле functions.php вашей темы или в плагине добавьте следующий код:
function wordpressy_schedule_backup() {
if (!wp_next_scheduled('wordpressy_daily_backup')) {
wp_schedule_event(time(), 'daily', 'wordpressy_daily_backup');
}
}
add_action('wp', 'wordpressy_schedule_backup');
add_action('wordpressy_daily_backup', function() {
$result = wordpressy_create_backup();
if ($result) {
error_log('Резервная копия создана: ' . print_r($result, true));
} else {
error_log('Ошибка создания резервной копии');
}
});
Этот код настроит ежедневный запуск функции резервного копирования. Вы можете изменить интервал, добавив собственный интервал в WP-Cron.
Отправка уведомлений о создании резервной копии
Чтобы всегда быть в курсе успешного создания бэкапа, можно отправлять уведомление на почту администратору:
add_action('wordpressy_daily_backup', function() {
$result = wordpressy_create_backup();
if ($result) {
wp_mail(get_option('admin_email'), 'Резервная копия WordPress создана',
'Бэкап файлов: ' . $result['files_backup'] . "\n" . 'Бэкап базы: ' . $result['db_backup']);
} else {
wp_mail(get_option('admin_email'), 'Ошибка создания резервной копии WordPress', 'Проверьте логи сервера.');
}
});
Полезные плагины для расширения функционала резервного копирования
Если в будущем решите использовать плагины, рекомендую обратить внимание на:
- Clearfy Pro — плагин для оптимизации и управления сайтом, включая настройки безопасности и бэкапов;
- WPRemark — хотя основной функционал не про бэкапы, может помочь с отзывами и обратной связью после восстановления;
- My Popup — для уведомлений посетителей, например, о технических работах во время восстановления.
Выводы и рекомендации
Создание автоматического резервного копирования WordPress без плагинов — отличное решение для опытных пользователей, желающих контролировать процесс и снизить нагрузку на сайт. Предложенный пример кода даёт основу для разработки собственного решения, которое можно расширять и адаптировать под задачи и инфраструктуру.
Не забывайте регулярно проверять бэкапы на целостность и возможность восстановления — это ключ к безопасности вашего сайта.