Резервное копирование — одна из ключевых задач при управлении сайтом на WordPress. Обычно для этого используют готовые плагины, но иногда возникает необходимость создать собственное решение без установки дополнительных расширений. В этой статье я расскажу, как сделать автоматический резервный копировщик сайта на WordPress с помощью встроенных возможностей и собственного PHP-кода.
Почему стоит делать резервные копии вручную и без плагинов
Плагины для резервного копирования удобны, но имеют ряд недостатков:
- Увеличивают нагрузку на сайт и могут конфликтовать с другими расширениями.
- Зависимость от разработчика плагина — обновления и поддержка могут прекратиться.
- Некоторые плагины платные или имеют ограничения в бесплатных версиях.
Создание собственного скрипта резервного копирования позволит:
- Точно контролировать процесс и формат бэкапа.
- Не нагружать сайт лишними плагинами.
- Автоматизировать задачу по расписанию с помощью WP-Cron.
Основные компоненты резервного копирования WordPress
Сайт WordPress состоит из двух ключевых частей, которые нужно сохранять:
- Файлы сайта: темы, плагины, загрузки, ядро WordPress.
- База данных: все записи, настройки, пользователи и пр.
Для полноценного восстановления нужно сохранить обе части. Мы создадим скрипт, который будет формировать два архива — файлов и дамп базы данных.
Создание функции резервного копирования файлов
Для архивации файлов используем стандартный класс ZipArchive PHP. Ниже пример функции, которая создает zip-архив с папкой wp-content/uploads — самой большой и часто изменяемой частью сайта. Аналогично можно архивировать и другие директории.
function wpone_backup_create_files_zip($backup_dir) {
$zip = new ZipArchive();
$zip_name = $backup_dir . '/uploads_backup_' . date('Y-m-d_H-i-s') . '.zip';
if ($zip->open($zip_name, ZipArchive::CREATE) !== TRUE) {
return false;
}
$upload_dir = WP_CONTENT_DIR . '/uploads';
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($upload_dir),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$file_path = $file->getRealPath();
$relative_path = substr($file_path, strlen($upload_dir) + 1);
$zip->addFile($file_path, $relative_path);
}
}
$zip->close();
return $zip_name;
}
В этом примере создается архив с файлами из папки uploads. Можно расширить функцию для архивации wp-content/themes и wp-content/plugins по аналогии.
Создание дампа базы данных
Для создания резервной копии базы данных вызовем системную команду mysqldump с параметрами из wp-config.php. Вот пример функции:
function wpone_backup_create_db_dump($backup_dir) {
global $wpdb;
$db_name = DB_NAME;
$db_user = DB_USER;
$db_password = DB_PASSWORD;
$db_host = DB_HOST;
$dump_file = $backup_dir . '/db_backup_' . date('Y-m-d_H-i-s') . '.sql';
$command = "mysqldump --user={$db_user} --password={$db_password} --host={$db_host} {$db_name} > {$dump_file}";
system($command, $retval);
if ($retval === 0) {
return $dump_file;
} else {
return false;
}
}
Для работы этой функции на сервере должна быть установлена утилита mysqldump, а PHP иметь доступ к системным командам.
Автоматизация резервного копирования с WP-Cron
Чтобы резервное копирование выполнялось автоматически, зарегистрируем собственное событие WP-Cron:
add_action('wpone_backup_cron_event', 'wpone_backup_run');
function wpone_backup_run() {
$backup_dir = WP_CONTENT_DIR . '/backups';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
$file_backup = wpone_backup_create_files_zip($backup_dir);
$db_backup = wpone_backup_create_db_dump($backup_dir);
if ($file_backup && $db_backup) {
error_log('Резервное копирование выполнено успешно: ' . $file_backup . ', ' . $db_backup);
} else {
error_log('Ошибка при выполнении резервного копирования');
}
}
// Планируем событие, если оно еще не запланировано
if (!wp_next_scheduled('wpone_backup_cron_event')) {
wp_schedule_event(time(), 'daily', 'wpone_backup_cron_event');
}
Этот код планирует ежедневное выполнение функции wpone_backup_run, которая создает резервные копии файлов и базы данных.
Отправка резервных копий на email или облачное хранилище
Для дополнительной безопасности рекомендуется копии сохранять не только на сервере, но и где-то еще. Например, отправлять архивы на email или загружать на облако — Google Drive, Dropbox. Здесь приведу пример отправки на email средствами WordPress:
function wpone_backup_send_email($file_path) {
$to = get_option('admin_email');
$subject = 'Резервная копия сайта WordPress';
$message = 'Во вложении резервная копия сайта.';
$attachments = array($file_path);
wp_mail($to, $subject, $message, '', $attachments);
}
В функцию wpone_backup_run можно добавить вызов этой функции для отправки созданных архивов.
Использование плагина Clearfy Pro для расширенного резервного копирования
Если вы хотите облегчить задачу и получить больше возможностей — например, хранить архивы в облаке, настраивать расписание и уведомления — посмотрите плагин Clearfy Pro. Он позволяет настроить автоматическое резервное копирование с множеством опций и не требует написания кода.
Резюме и рекомендации по безопасности
Создание собственного автоматического резервного копирования — отличное решение для опытных пользователей и разработчиков, которые хотят контролировать процесс и минимизировать зависимости. Главное — обеспечить безопасность архивов и ограничить к ним доступ. Например, хранить копии вне публичной директории сайта и регулярно проверять работоспособность восстановления.
Также не забывайте удалять старые архивы, чтобы не переполнять диск. Для этого можно добавить в функцию очистку резервных копий старше определенного срока.
Пример удаления архивов старше 7 дней:
function wpone_backup_cleanup_old($backup_dir) {
$files = glob($backup_dir . '/*');
$now = time();
foreach ($files as $file) {
if (is_file($file) && ($now - filemtime($file)) > 7 * 24 * 60 * 60) {
unlink($file);
}
}
}
Вызывайте эту функцию в процессе резервного копирования, чтобы архивы не накапливались.