Резервное копирование WordPress — одна из ключевых задач для обеспечения безопасности и сохранности данных сайта. Хотя существует множество плагинов для бэкапа, иногда хочется реализовать автоматическое резервное копирование с помощью собственного кода, чтобы иметь полный контроль и интеграцию с существующими процессами.
Почему стоит делать автоматическое резервное копирование WordPress
Регулярное резервное копирование позволяет быстро восстановить сайт после сбоев, взломов или ошибок при обновлениях. Автоматизация этого процесса снижает человеческий фактор — не нужно помнить о ручном запуске бэкапа, что повышает надежность и безопасность.
Также автоматический бэкап можно настроить с учётом специфики сайта: например, сохранять только базу данных, только файлы темы, или полный архив с плагинами и медиа.
Основные компоненты резервного копирования WordPress
В WordPress важны две части для резервного копирования:
- База данных — содержит все записи, страницы, настройки, пользователей, комментарии.
- Файлы сайта — темы, плагины, загрузки (медиа), конфигурационные файлы.
Для полноценного восстановления нужно создавать копии обеих частей.
Пример кода для автоматического резервного копирования базы данных
Рассмотрим пример функции, которая делает дамп базы данных WordPress и сохраняет его в папку wp-content/backups. Чтобы этот код выполнялся регулярно, можно запланировать запуск через WP-Cron.
function wporg_backup_export_database() {
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;
$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" . $create_table[1] . ";\n\n";
$rows = $wpdb->get_results("SELECT * FROM $table_name", ARRAY_A);
foreach ( $rows as $row ) {
$values = array_map( function($value) use ($wpdb) {
return isset($value) ? '\'' . esc_sql($value) . '\'' : 'NULL';
}, array_values($row));
$sql_dump .= "INSERT INTO $table_name VALUES (" . implode(", ", $values) . ");\n";
}
}
file_put_contents( $filepath, $sql_dump );
}
// Добавляем расписание через WP-Cron
function wporg_backup_schedule() {
if ( ! wp_next_scheduled( 'wporg_backup_daily_event' ) ) {
wp_schedule_event( time(), 'daily', 'wporg_backup_daily_event' );
}
}
add_action( 'wp', 'wporg_backup_schedule' );
add_action( 'wporg_backup_daily_event', 'wporg_backup_export_database' );
Этот код создает SQL-файл с дампом всех таблиц базы данных раз в день и сохраняет в папку wp-content/backups. Папка должна быть доступна для записи.
Как сделать резервное копирование файлов сайта
Резервное копирование файлов — более объемная задача, так как темы, плагины и особенно папка uploads могут содержать сотни мегабайт и более. Для этого удобно использовать встроенную PHP-функцию ZipArchive для создания архива.
Пример функции создания ZIP-архива папки uploads:
function wporg_backup_uploads_folder() {
$uploads_dir = wp_get_upload_dir()['basedir'];
$backup_dir = WP_CONTENT_DIR . '/backups';
if ( ! file_exists( $backup_dir ) ) {
wp_mkdir_p( $backup_dir );
}
$zip_name = $backup_dir . '/uploads-backup-' . date('Y-m-d_H-i-s') . '.zip';
$zip = new ZipArchive();
if ( $zip->open( $zip_name, ZipArchive::CREATE ) === true ) {
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($uploads_dir),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ( $files as $name => $file ) {
if ( ! $file->isDir() ) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($uploads_dir) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
}
}
Эту функцию можно вызывать вместе с бэкапом базы данных или по отдельному расписанию.
Автоматизация и уведомления
Для полноценной автоматизации полезно:
- Добавить проверку наличия папки для бэкапов и прав на запись.
- Ограничить количество сохраненных резервных копий, удаляя старые.
- Отправлять уведомления на email или в админку после успешного или неудачного бэкапа.
Пример функции удаления старых бэкапов старше 7 дней:
function wporg_backup_cleanup_old_files() {
$backup_dir = WP_CONTENT_DIR . '/backups';
$files = glob( $backup_dir . '/*' );
$now = time();
foreach ( $files as $file ) {
if ( is_file($file) && ($now - filemtime($file)) > 7 * DAY_IN_SECONDS ) {
unlink($file);
}
}
}
add_action( 'wporg_backup_daily_event', 'wporg_backup_cleanup_old_files' );
Плагины для расширения возможностей резервного копирования
Если хочется готовое решение с интерфейсом и расширенными функциями, можно использовать плагины, совместимые с WPShop, такие как Clearfy Pro — он содержит инструменты для оптимизации и безопасности, включая автоматический бэкап и очистку сайта.
Также можно рассмотреть плагины типа UpdraftPlus или BackWPup, но если нужна глубокая кастомизация — лучше писать собственный код.
Выводы
Автоматическое резервное копирование WordPress с помощью собственного кода — практическое и полезное решение для разработчиков, которые хотят полный контроль над процессом. Используя WP-Cron, ZipArchive и функции работы с базой данных, можно создать надежный механизм бэкапа, адаптированный под конкретные потребности сайта.
Регулярные копии базы данных и файлов, контроль количества сохраненных архивов и уведомления позволят быстро восстановиться в случае непредвиденных ситуаций.