Как создать автоматические бэкапы базы данных WordPress без плагинов

Почему важны автоматические бэкапы базы данных WordPress

База данных WordPress — это сердце вашего сайта, где хранятся все записи, настройки, комментарии и многое другое. Потеря данных из-за сбоев, взлома или ошибок обновления может привести к серьезным проблемам. Регулярные автоматические бэкапы позволяют минимизировать риски и быстро восстановить сайт в случае непредвиденных ситуаций.

Хотя существует множество плагинов для резервного копирования, иногда возникает необходимость обойтись без них, чтобы уменьшить нагрузку на сайт или избежать конфликтов. В этой статье мы рассмотрим, как создать собственный механизм автоматических бэкапов базы данных WordPress с помощью кода и планировщика заданий WP-Cron.

Как работает WP-Cron и почему он подходит для автоматических бэкапов

WP-Cron — это встроенный механизм планирования задач в WordPress. В отличие от системных cron-задач, WP-Cron запускается только при посещении сайта, что делает его удобным для хостингов с ограничениями.

С его помощью можно запускать периодические задачи, например, создание резервных копий базы данных. Однако важно учитывать, что если на сайт долго не заходят, задания могут выполняться с задержками. Для критически важных проектов лучше использовать системный cron, но для большинства случаев WP-Cron подходит отлично.

Создаем функцию для создания резервной копии базы данных

Для начала напишем функцию, которая создаст дамп базы данных и сохранит его в папку wp-content/backups. Если папка не существует, функция создаст ее автоматически.

function wpunit_create_db_backup() {
    global $wpdb;
    $backup_dir = WP_CONTENT_DIR . '/backups';
    if ( ! file_exists( $backup_dir ) ) {
        wp_mkdir_p( $backup_dir );
    }
    $filename = 'wp-db-backup-' . date( 'Y-m-d-H-i-s' ) . '.sql';
    $filepath = $backup_dir . '/' . $filename;

    $tables = $wpdb->get_results( 'SHOW TABLES', ARRAY_N );
    if ( ! $tables ) {
        return false;
    }

    $dump = '';
    foreach ( $tables as $table ) {
        $table = $table[0];
        $create_table = $wpdb->get_row( "SHOW CREATE TABLE `{$table}`", ARRAY_N );
        $dump .= "\nDROP TABLE IF EXISTS `{$table}`;\n";
        $dump .= $create_table[1] . ";\n\n";

        $rows = $wpdb->get_results( "SELECT * FROM `{$table}`", ARRAY_A );
        foreach ( $rows as $row ) {
            $values = array_map( function( $value ) use ( $wpdb ) {
                return isset( $value ) ? '\'' . esc_sql( $value ) . '\'' : 'NULL';
            }, array_values( $row ) );
            $dump .= "INSERT INTO `{$table}` VALUES (" . implode( ',', $values ) . ");\n";
        }
        $dump .= "\n";
    }
    file_put_contents( $filepath, $dump );
    return $filepath;
}

Эта функция последовательно получает список всех таблиц, создает SQL-команды для их удаления и создания, а также вставки всех данных. Результат сохраняется в SQL-файл в папке wp-content/backups.

Автоматизация создания бэкапов с помощью WP-Cron

Теперь настроим задание в WP-Cron, которое будет запускать функцию wpunit_create_db_backup ежедневно. Для этого добавим регистрацию события и колбэк.

add_action( 'wpunit_daily_db_backup_event', 'wpunit_create_db_backup' );

function wpunit_activate_backup_schedule() {
    if ( ! wp_next_scheduled( 'wpunit_daily_db_backup_event' ) ) {
        wp_schedule_event( time(), 'daily', 'wpunit_daily_db_backup_event' );
    }
}
add_action( 'wp', 'wpunit_activate_backup_schedule' );

// Для очистки расписания при деактивации темы или плагина
function wpunit_deactivate_backup_schedule() {
    $timestamp = wp_next_scheduled( 'wpunit_daily_db_backup_event' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpunit_daily_db_backup_event' );
    }
}

Этот код создает новое событие wpunit_daily_db_backup_event, которое запускается ежедневно и вызывает функцию создания бэкапа. При необходимости отключения нужно вызвать функцию wpunit_deactivate_backup_schedule.

Дополнительные улучшения и советы по безопасности

1. Удаление старых бэкапов: Чтобы не засорять дисковое пространство, стоит добавить логику удаления файлов старше определенного времени (например, 7 дней). Это можно сделать, добавляя в функцию проверку и удаление.

2. Защита доступа к папке backup: Чтобы исключить возможность скачивания бэкапов с сайта, создайте в папке backups файл .htaccess с содержимым:

Order deny,allow
Deny from all

3. Отправка уведомлений: Можно добавить отправку email после успешного создания бэкапа с прикрепленным файлом или ссылкой на него.

Пример удаления старых бэкапов

function wpunit_cleanup_old_backups() {
    $backup_dir = WP_CONTENT_DIR . '/backups';
    if ( ! file_exists( $backup_dir ) ) {
        return;
    }
    $files = glob( $backup_dir . '/wp-db-backup-*.sql' );
    $now = time();
    foreach ( $files as $file ) {
        if ( $now - filemtime( $file ) > 7 * DAY_IN_SECONDS ) {
            unlink( $file );
        }
    }
}

Эту функцию можно вызывать в начале wpunit_create_db_backup или в отдельном cron-событии.

Пример комплексного решения с уведомлением по email

Объединим создание бэкапа, очистку старых файлов и отправку уведомления:

function wpunit_create_db_backup_with_notification() {
    wpunit_cleanup_old_backups();
    $backup_path = wpunit_create_db_backup();
    if ( $backup_path ) {
        $to = get_option( 'admin_email' );
        $subject = 'Резервная копия базы данных WordPress';
        $message = 'Резервная копия базы данных успешно создана: ' . basename( $backup_path );
        wp_mail( $to, $subject, $message );
    }
}

Не забудьте заменить в расписании вызов функции на wpunit_create_db_backup_with_notification.

Альтернатива: использование плагина Clearfy Pro для управления бэкапами

Если вы хотите облегчить работу с резервными копиями и получить дополнительные инструменты оптимизации, обратите внимание на плагин Clearfy Pro. Он позволяет настроить автоматические бэкапы, оптимизацию базы данных и очистку мусора без сложного кода.

Однако если вы предпочитаете минимализм и полный контроль, предложенный в статье способ — отличный выбор.

Итог

Создание автоматических бэкапов базы данных WordPress собственными силами — вполне реализуемая задача без использования сторонних плагинов. Используя WP-Cron и PHP, вы можете настроить стабильный и безопасный механизм резервного копирования, который защитит ваши данные и обеспечит быстрое восстановление сайта при необходимости.