Автоматическое резервное копирование базы данных — одна из важнейших задач при управлении сайтом на WordPress. Большинство сайтов используют плагины для бэкапа, но в некоторых случаях бывает полезно иметь собственный скрипт, который создаст резервную копию базы данных по расписанию, без сторонних расширений. В этой статье рассмотрим, как реализовать такую автоматизацию с помощью PHP-кода и WP-Cron.
Почему важен автоматический бэкап базы данных WordPress
База данных WordPress содержит все ключевые данные: записи, страницы, настройки, комментарии и пользовательские данные. Потеря или повреждение базы ведет к серьезным проблемам, вплоть до полного удаления сайта. Регулярный бэкап позволяет быстро восстановиться после ошибок, взломов или сбоев хостинга.
Автоматизация бэкапа минимизирует человеческий фактор — вы забудете сделать копию или сделаете это нерегулярно. За счет реализации бэкапа через код можно гибко настроить частоту, формат и место хранения копий.
Настройка автоматического бэкапа через WP-Cron
WordPress имеет встроенную систему планировщика задач — WP-Cron, с помощью которой можно запускать наши функции по расписанию. Создадим кастомное событие, которое раз в сутки будет создавать SQL-дамп базы данных и сохранять его в папку wp-content/backups.
Шаг 1. Регистрируем крон-событие
Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код:
function wpcode_register_daily_backup_event() {
if ( ! wp_next_scheduled( 'wpcode_daily_backup_event' ) ) {
wp_schedule_event( time(), 'daily', 'wpcode_daily_backup_event' );
}
}
add_action( 'wp', 'wpcode_register_daily_backup_event' );Этот код регистрирует ежедневное событие wpcode_daily_backup_event, если оно еще не запланировано.
Шаг 2. Создаем функцию для бэкапа
Теперь необходимо написать функцию, которая создаст дамп базы в формате SQL и сохранит его на сервере.
function wpcode_create_database_backup() {
global $wpdb;
$backup_dir = WP_CONTENT_DIR . '/backups';
if ( ! file_exists( $backup_dir ) ) {
wp_mkdir_p( $backup_dir );
}
$filename = 'db-backup-' . date( 'Y-m-d-H-i-s' ) . '.sql';
$filepath = $backup_dir . '/' . $filename;
$db_host = DB_HOST;
$db_name = DB_NAME;
$db_user = DB_USER;
$db_password = DB_PASSWORD;
// Формируем команду mysqldump
$command = sprintf(
'mysqldump --user=%s --password=%s --host=%s %s > %s',
escapeshellarg($db_user),
escapeshellarg($db_password),
escapeshellarg($db_host),
escapeshellarg($db_name),
escapeshellarg($filepath)
);
exec($command, $output, $return_var);
if ($return_var === 0) {
error_log('[' . date('Y-m-d H:i:s') . '] WPCode: Бэкап базы данных успешно создан: ' . $filepath);
} else {
error_log('[' . date('Y-m-d H:i:s') . '] WPCode: Ошибка при создании бэкапа базы данных.');
}
}
add_action( 'wpcode_daily_backup_event', 'wpcode_create_database_backup' );Обратите внимание, что для выполнения mysqldump на сервере должна быть доступна эта команда, а PHP должен иметь права на создание файлов в папке wp-content/backups.
Альтернативный вариант без mysqldump — экспорт через PHP
Если у вас нет доступа к mysqldump, можно сделать резервную копию базы через PHP, выгрузив таблицы и их данные вручную. Это может быть медленнее и тяжелее, но работает на любом хостинге.
Пример базового варианта такой функции:
function wpcode_export_db_to_sql() {
global $wpdb;
$tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
$sql = '';
foreach ($tables as $table) {
$table_name = $table[0];
// Получаем структуру таблицы
$create_table = $wpdb->get_row('SHOW CREATE TABLE ' . $table_name, ARRAY_N);
$sql .= $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) {
return isset($val) ? "'" . esc_sql($val) . "'" : 'NULL';
}, $row);
$sql .= 'INSERT INTO ' . $table_name . ' VALUES(' . implode(',', $vals) . ");\n";
}
$sql .= "\n\n";
}
$backup_dir = WP_CONTENT_DIR . '/backups';
if (!file_exists($backup_dir)) {
wp_mkdir_p($backup_dir);
}
$filename = 'db-backup-' . date('Y-m-d-H-i-s') . '.sql';
$filepath = $backup_dir . '/' . $filename;
file_put_contents($filepath, $sql);
error_log('[' . date('Y-m-d H:i:s') . '] WPCode: Бэкап базы данных (через PHP) сохранен: ' . $filepath);
}
add_action('wpcode_daily_backup_event', 'wpcode_export_db_to_sql');Данный способ создает SQL-файл с полным дампом таблиц и данных, но может быть проблемным при очень больших базах.
Безопасность и хранение резервных копий
Очень важно хранить бэкапы в безопасном месте. Папка wp-content/backups по умолчанию доступна из браузера, и это риск. Чтобы защитить бэкапы:
- Добавьте в папку файл
.htaccessс содержимымdeny from all(для Apache). - Или настройте правила доступа на уровне сервера (Nginx).
- Регулярно переносите копии на удаленные хранилища — FTP, облако, или скачивайте локально.
Пример использования плагина для расширенных возможностей
Если хотите более гибкие решения с интерфейсом, посмотрите плагин Clearfy Pro — он предлагает расширенные настройки оптимизации и бэкапа, включая автоматическое удаление старых копий и интеграцию с облачными сервисами.
Как вручную запускать бэкап и проверять логи
Для тестирования функции можно вызвать её вручную, например, добавив временно в functions.php:
add_action('init', 'wpcode_create_database_backup');После первого срабатывания не забудьте убрать этот код, чтобы не создавать избыточные копии.
Ошибки и успешные операции сохраняются в системный лог PHP (error_log), где их можно проверить через хостинг или панели управления.
Итоги
Создание автоматического бэкапа базы данных WordPress через собственный код — полезный навык, позволяющий контролировать процесс без сторонних плагинов. Использование WP-Cron и PHP дает гибкость и простоту настройки, а при необходимости можно интегрировать с существующими плагинами и сервисами.
Экспериментируйте с примерами, адаптируйте под свои нужды и не забывайте о безопасности!