Как сделать автоматическое резервное копирование WordPress с помощью кода

Резервное копирование 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 и функции работы с базой данных, можно создать надежный механизм бэкапа, адаптированный под конкретные потребности сайта.

Регулярные копии базы данных и файлов, контроль количества сохраненных архивов и уведомления позволят быстро восстановиться в случае непредвиденных ситуаций.

Скачать WP с оф. сайта Магазин проверенных платных тем