Автоматическое резервное копирование — важная часть обслуживания любого сайта на WordPress. Многие предпочитают использовать готовые плагины для бэкапов, но в некоторых случаях хочется обойтись без них — например, чтобы не нагружать сайт лишними расширениями или иметь полный контроль над процессом.
Почему важно делать резервные копии WordPress
Резервное копирование защищает вас от потери данных из-за взлома, ошибки хостинга или случайного удаления файлов. При наличии актуальных бэкапов вы можете быстро восстановить сайт и минимизировать простой.
Создавая бэкапы, нужно учитывать, что WordPress состоит из двух основных частей: базы данных и файлов сайта (темы, плагины, медиа). Для полного восстановления нужно сохранить и то, и другое.
Настройка автоматического резервного копирования с помощью WP-Cron
WP-Cron — встроенный механизм планирования задач в WordPress, который позволяет запускать определённые функции по расписанию без участия пользователя. Мы можем использовать его, чтобы запускать задачу копирования файлов и базы данных автоматически, например, раз в сутки.
Для начала создадим функцию, которая будет делать бэкап.
Создание функции резервного копирования
Ниже пример функции wpassist_backup_site, которая делает архив папки с файлами сайта и экспортирует базу данных в SQL-файл.
function wpassist_backup_site() {
$upload_dir = wp_upload_dir();
$backup_dir = $upload_dir['basedir'] . '/wpassist-backups';
if ( ! file_exists($backup_dir) ) {
mkdir($backup_dir, 0755, true);
}
// Имя архива с датой
$date = date('Y-m-d-His');
$zip_path = $backup_dir . "/backup-files-{$date}.zip";
$sql_path = $backup_dir . "/backup-db-{$date}.sql";
// Создаём ZIP архив файлов
$zip = new ZipArchive();
if ( $zip->open($zip_path, ZipArchive::CREATE) === TRUE ) {
$rootPath = ABSPATH;
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
// Исключаем папку backup
if (strpos($filePath, $backup_dir) === false) {
$relativePath = substr($filePath, strlen($rootPath));
$zip->addFile($filePath, $relativePath);
}
}
}
$zip->close();
}
// Экспортируем базу данных
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 .= "DROP TABLE IF EXISTS `{$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(array($wpdb, 'escape'), array_values($row));
$vals = array_map(function($v) { return "'" . str_replace("'", "''", $v) . "'"; }, $vals);
$sql_dump .= "INSERT INTO `{$table_name}` VALUES (" . implode(", ", $vals) . ");\n";
}
$sql_dump .= "\n";
}
file_put_contents($sql_path, $sql_dump);
// Можно добавить логику уведомления или очистку старых бэкапов
}
Регистрация задачи WP-Cron
Теперь нужно добавить событие, которое будет запускать функцию wpassist_backup_site регулярно, например, раз в день.
function wpassist_schedule_backup() {
if ( ! wp_next_scheduled( 'wpassist_daily_backup' ) ) {
wp_schedule_event( time(), 'daily', 'wpassist_daily_backup' );
}
}
add_action('wp', 'wpassist_schedule_backup');
add_action('wpassist_daily_backup', 'wpassist_backup_site');
Так мы настроим ежедневное выполнение резервного копирования.
Как управлять и использовать резервные копии
Резервные копии сохраняются в папке wp-content/uploads/wpassist-backups. Рекомендуется регулярно скачивать эти архивы на локальный компьютер или в облачное хранилище, чтобы обезопасить данные при проблемах с сервером.
Для удобства можно дополнительно сделать страницу в админке WordPress, где будут отображаться доступные бэкапы с кнопками для скачивания и удаления. Это можно реализовать с помощью стандартных функций WordPress и AJAX.
Альтернативы и плагины для резервного копирования
Если вы не хотите писать код, можно использовать проверенные плагины, например:
- Clearfy Pro — многофункциональный плагин с возможностями оптимизации и бэкапа.
- WPRemark — хотя в основном для комментариев, но может помочь в автоматизации.
Но если нужен лёгкий и контролируемый способ — наш код отлично подходит.
Советы по безопасности резервного копирования
При создании резервных копий важно:
- Хранить бэкапы в папках, недоступных через веб или защищённых паролем.
- Регулярно очищать старые архивы, чтобы не переполнять диск.
- Использовать шифрование, если копии содержат конфиденциальные данные.
- Тестировать восстановление, чтобы быть уверенным в работоспособности бэкапов.
Пример добавления базовой защиты папки с бэкапами — создание файла .htaccess внутри wpassist-backups со следующим содержимым:
deny from all
Это запретит доступ по HTTP к резервным копиям.
Заключение
Создание автоматического резервного копирования WordPress без плагинов — задача вполне решаемая с помощью PHP и WP-Cron. Такой подход даёт полный контроль и минимальную нагрузку на сайт.
Можно дополнить функционал уведомлениями по email или интеграцией с облачными сервисами для хранения бэкапов. Но и базового варианта, описанного выше, достаточно для большинства целей.
Если хотите расширить функционал, смотрите другие статьи сайта или используйте плагины из WPShop с возможностями автоматизации и безопасности.