Резервное копирование — одна из важных задач при управлении сайтом на WordPress. Многие владельцы сайтов используют плагины, но автоматизировать этот процесс через код позволяет гибко настраивать частоту, типы данных для резервирования и способ хранения копий. В этой статье мы подробно разберём, как реализовать автоматическое создание резервных копий с помощью пользовательского кода, а также рассмотрим популярные плагины для резервного копирования с автоматизацией и интеграцию с ними.
Почему важно автоматизировать резервное копирование WordPress
Резервные копии позволяют быстро восстановить сайт после сбоев, взломов или ошибок при обновлениях. Автоматизация гарантирует, что копии создаются регулярно без участия администратора, что уменьшает риск потери данных.
Ручное резервное копирование часто забывается или выполняется нерегулярно, что негативно сказывается на безопасности сайта. Автоматизация снижает человеческий фактор и позволяет планировать бэкапы в удобное время.
Также автоматизация позволяет интегрировать резервные копии с облачными хранилищами (Google Drive, Dropbox), FTP-серверами и другими сервисами, что повышает надёжность хранения данных.
Создание автоматического резервного копирования с помощью WP-Cron
WordPress имеет встроенную систему задач — WP-Cron, которая позволяет запускать функции по расписанию. Используя WP-Cron, можно настроить автоматическое создание архивов базы данных и файлов сайта.
Регистрация cron-задачи для резервного копирования
Первым шагом регистрируем новую задачу, которая будет запускать функцию создания резервной копии. Для этого добавьте в файл functions.php вашей темы или в отдельный плагин такой код:
function wpcource_schedule_backup() {
if ( ! wp_next_scheduled( 'wpcource_cron_backup_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpcource_cron_backup_hook' );
}
}
add_action( 'wp', 'wpcource_schedule_backup' );
// Обработка события
add_action( 'wpcource_cron_backup_hook', 'wpcource_create_backup' );
Здесь мы регистрируем событие, которое будет запускаться ежедневно. Можно заменить 'daily' на 'twicedaily' или создать своё расписание.
Функция создания резервной копии базы данных
Для примера создадим дамп базы данных в формате SQL и сохраним его в папку wp-content/backups. Для этого понадобится функция:
function wpcource_create_backup() {
global $wpdb;
$upload_dir = wp_upload_dir();
$backup_dir = WP_CONTENT_DIR . '/backups';
if ( ! file_exists( $backup_dir ) ) {
wp_mkdir_p( $backup_dir );
}
$filename = $backup_dir . '/backup-' . date( 'Y-m-d-H-i-s' ) . '.sql';
$tables = $wpdb->get_results( 'SHOW TABLES', ARRAY_N );
$sql_dump = '';
foreach ( $tables as $table ) {
$table_name = $table[0];
// Создаём структуру таблицы
$create_table = $wpdb->get_row( "SHOW CREATE TABLE $table_name", ARRAY_N );
$sql_dump .= "\n\n-- Структура таблицы для $table_name\n";
$sql_dump .= $create_table[1] . ";\n\n";
// Получаем данные таблицы
$rows = $wpdb->get_results( "SELECT * FROM $table_name", ARRAY_A );
foreach ( $rows as $row ) {
$vals = array_map( function( $val ) use ( $wpdb ) {
if ( is_null( $val ) ) return 'NULL';
return "'" . esc_sql( $val ) . "'";
}, array_values( $row ) );
$sql_dump .= "INSERT INTO $table_name VALUES (" . implode( ',', $vals ) . ");\n";
}
}
file_put_contents( $filename, $sql_dump );
}
Эта функция создаёт полный дамп базы данных. Для больших баз можно оптимизировать, разбив экспорт на части.
Резервное копирование файлов сайта
Резервирование файлов сайта — важная часть, чтобы сохранить темы, плагины и загруженные изображения. Пример простейшего архива:
function wpcource_backup_files() {
$backup_dir = WP_CONTENT_DIR . '/backups';
$archive_file = $backup_dir . '/files-backup-' . date( 'Y-m-d-H-i-s' ) . '.zip';
if ( ! class_exists( 'ZipArchive' ) ) {
error_log( 'ZipArchive не доступен на сервере' );
return;
}
$zip = new ZipArchive();
if ( $zip->open( $archive_file, ZipArchive::CREATE ) !== true ) {
error_log( 'Не удалось создать архив' );
return;
}
$root_path = ABSPATH;
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root_path),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ( $files as $name => $file ) {
if ( ! $file->isDir() ) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($root_path));
// Исключаем папки кэша и временные файлы
if ( strpos($relativePath, 'cache') === false && strpos($relativePath, 'tmp') === false ) {
$zip->addFile($filePath, $relativePath);
}
}
}
$zip->close();
}
Объедините функции создания бэкапов базы и файлов в одну задачу WP-Cron, чтобы запускать комплексное резервирование.
Использование плагинов для автоматизации резервного копирования
Если хочется готовое решение с удобным интерфейсом, рассмотрите плагины:
- UpdraftPlus — популярный плагин с поддержкой автоматических бэкапов и выгрузкой в облако.
- WPvivid Backup — позволяет настроить расписание, отправку на FTP и облачные хранилища.
- BackWPup — классика с настройками cron и интеграцией с Dropbox, S3, FTP.
Для каждого плагина можно настроить расписание и выбрать, что именно копировать — базу данных, файлы, плагины, темы. Многие плагины позволяют выполнять автоматическую очистку старых копий для экономии места.
Интеграция с WP-Cron для расширенной автоматизации
Например, с плагином UpdraftPlus можно программно запускать бэкапы через хук:
function wpcource_trigger_updraft_backup() {
if ( class_exists( 'UpdraftPlus_BackupModule' ) ) {
$updraft = UpdraftPlus_BackupModule::get_instance();
$updraft->backup('backup');
}
}
add_action('wpcource_cron_backup_hook', 'wpcource_trigger_updraft_backup');
Так вы объедините возможности плагина и собственный cron для гибкой настройки расписания.
Хранение резервных копий в облаке и отправка уведомлений
Для повышения безопасности важно сохранять копии не на сервере сайта, а в облаке или на удалённом сервере. Можно настроить передачу файлов по FTP, SFTP, или использовать API облачных провайдеров.
Пример загрузки файла на Google Drive с помощью Google API требует отдельной авторизации и настройки сервисного аккаунта. Для простоты можно использовать плагины с поддержкой облаков или настроить отправку архива на email.
Отправка уведомлений после создания бэкапа
Для контроля процесса можно добавить отправку email или Telegram-сообщений о результате:
function wpcource_notify_backup_result( $message ) {
wp_mail( 'admin@example.com', 'Резервная копия WordPress', $message );
}
function wpcource_create_backup() {
// код резервного копирования...
$success = true; // пример результата
if ( $success ) {
wpcource_notify_backup_result('Резервная копия успешно создана.');
} else {
wpcource_notify_backup_result('Ошибка при создании резервной копии.');
}
}
Это позволит быстро реагировать на сбои без постоянного контроля.
Рекомендации по безопасности и оптимизации процесса
Резервные копии содержат чувствительные данные, поэтому важно ограничить доступ к папке с ними, например, с помощью .htaccess или правил сервера.
Не храните большое количество копий на одном сервере — это может привести к занятому дисковому пространству.
Для крупных сайтов рассмотрите поэтапное резервное копирование или использование специализированных сервисов.
Оптимизируйте WP-Cron, чтобы задачи не запускались одновременно на всех посетителях сайта, например, используя реальные системные cron-задачи для вызова WP-Cron.