Автоматическое резервное копирование файлов — важная часть безопасности и стабильности любого сайта на WordPress. В этой статье мы рассмотрим, как создать собственный автоматический резервный копировщик файлов, который будет периодически сохранять копии ваших медиафайлов и других важных данных. Это решение будет полезно, если вы хотите иметь полный контроль над процессом и избежать зависимости от сторонних сервисов.
Почему важен автоматический бэкап файлов WordPress
Резервное копирование — это страховка от потери данных из-за сбоев, взломов или ошибок при обновлениях. Особенно важно сохранять не только базу данных, но и файлы — темы, плагины, медиа, пользовательские загрузки.
Автоматизация процесса позволяет не забывать делать бэкапы и снижает нагрузку на администратора сайта.
Встроенные решения и популярные плагины (например, UpdraftPlus, BackWPup) отлично справляются с задачей, но если вы хотите создать кастомное решение, которое будет адаптировано под ваши нужды, то следующий раздел для вас.
Как работает резервный копировщик: базовые принципы и WP-Cron
Для автоматизации нам понадобится запланированная задача. WordPress имеет встроенный механизм планировщика задач — WP-Cron. Он позволяет запускать функции по расписанию.
Принцип работы:
1. Запускается функция создания архива файлов.
2. Архив сохраняется в заданную папку с уникальным именем (например, с текущей датой).
3. Старые архивы можно автоматически удалять, чтобы не засорять место на сервере.
WP-Cron запускается каждый раз, когда кто-то посещает сайт, но для серверов с низким трафиком рекомендуется настроить системный cron для вызова WP-Cron.
Пример создания простого плагина для резервного копирования файлов
Ниже пример плагина, который создаёт архив папки wp-content/uploads и сохраняет его в wp-content/backups. В архив включены только медиафайлы, но вы можете расширить фильтр.
<?php
/**
* Plugin Name: WPUpload Backup
* Description: Автоматический резервный копировщик файлов wp-content/uploads
* Version: 1.0
* Author: WPUpload.ru
*/
// Создаем расписание при активации плагина
function wpupload_backup_activation() {
if (!wp_next_scheduled('wpupload_backup_event')) {
wp_schedule_event(time(), 'daily', 'wpupload_backup_event');
}
}
register_activation_hook(__FILE__, 'wpupload_backup_activation');
// Удаляем расписание при деактивации
function wpupload_backup_deactivation() {
wp_clear_scheduled_hook('wpupload_backup_event');
}
register_deactivation_hook(__FILE__, 'wpupload_backup_deactivation');
// Основная функция резервного копирования
function wpupload_do_backup() {
$upload_dir = wp_upload_dir();
$source = $upload_dir['basedir'];
$backup_dir = WP_CONTENT_DIR . '/backups';
if (!file_exists($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
$date = date('Y-m-d_H-i-s');
$archive_file = $backup_dir . '/backup_' . $date . '.zip';
$zip = new ZipArchive();
if ($zip->open($archive_file, ZipArchive::CREATE) !== TRUE) {
error_log('WPUpload Backup: Не удалось создать архив');
return;
}
$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);
// Можно добавить фильтр по расширениям, например только изображения
$allowed_ext = array('jpg', 'jpeg', 'png', 'gif', 'pdf', 'mp4', 'webm');
$ext = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
if (in_array($ext, $allowed_ext)) {
$zip->addFile($filePath, $relativePath);
}
}
}
$zip->close();
// Удаляем архивы старше 30 дней
wpupload_cleanup_old_backups($backup_dir, 30);
}
add_action('wpupload_backup_event', 'wpupload_do_backup');
// Функция очистки старых бэкапов
function wpupload_cleanup_old_backups($dir, $days = 30) {
$files = glob($dir . '/backup_*.zip');
$now = time();
foreach ($files as $file) {
if (is_file($file)) {
if ($now - filemtime($file) >= ($days * 86400)) {
unlink($file);
}
}
}
}
?>Как расширить функционал резервного копировщика
Добавление уведомлений по email
Чтобы быть в курсе успешных или неудачных резервных копий, можно добавить отправку email администратору:
function wpupload_do_backup() {
// ... существующий код архивации
if ($zip->status === ZIPARCHIVE::ER_OK) {
wp_mail(get_option('admin_email'), 'Резервное копирование WordPress', 'Резервная копия создана: ' . $archive_file);
} else {
wp_mail(get_option('admin_email'), 'Ошибка резервного копирования WordPress', 'Не удалось создать резервную копию.');
}
}Бэкап базы данных вместе с файлами
Для полного восстановления полезно сохранять базу данных. Пример функции для экспорта SQL:
function wpupload_backup_database($backup_dir) {
global $wpdb;
$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 .= $create_table[1] . ";\n\n";
$rows = $wpdb->get_results('SELECT * FROM ' . $table_name, ARRAY_A);
foreach ($rows as $row) {
$vals = array_map(array($wpdb, 'escape'), array_values($row));
$vals = array_map(function($v) { return "'" . $v . "'"; }, $vals);
$sql_dump .= "INSERT INTO `" . $table_name . "` VALUES (" . implode(",", $vals) . ");\n";
}
$sql_dump .= "\n";
}
$filename = $backup_dir . '/db_backup_' . date('Y-m-d_H-i-s') . '.sql';
file_put_contents($filename, $sql_dump);
return $filename;
}Рекомендации и лучшие практики для бэкапов в WordPress
1. Храните бэкапы вне корневой папки сайта или на внешних ресурсах (облачное хранилище, FTP, Dropbox). Это повысит безопасность.
2. Регулярно проверяйте целостность и возможность восстановления из бэкапов.
3. Используйте системный cron для запуска WP-Cron на серверах с низким трафиком.
4. Ограничивайте размер архива и количество хранимых копий, чтобы не исчерпать дисковое пространство.
5. Рассмотрите использование готовых решений, если не хотите заниматься поддержкой собственного кода.
Полезные плагины для резервного копирования с расширением возможностей
Кроме собственного кода, рекомендуем обратить внимание на плагины из WPShop.ru:
- Clearfy Pro — оптимизация и безопасность сайта, включая автоматизацию разных задач.
- Expert Review — помогает настроить проверку и контроль процессов, в том числе связанных с бэкапами.
- My Popup — можно использовать для уведомления администраторов о статусе резервных копий.
Эти плагины можно интегрировать с вашим бэкап-решением для расширения функционала.