wpbackup.ru wordpress WPBackup.ru

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

Зачем создавать собственный плагин для резервного копирования WordPress

Резервное копирование – одна из важнейших задач при администрировании сайта на WordPress. Хотя существует множество готовых плагинов, таких как UpdraftPlus или BackWPup, иногда требуется создать кастомное решение, чтобы точно контролировать процесс, интегрировать его с уникальными сервисами или автоматизировать под свои нужды. В этой статье мы разберём, как разработать собственный плагин для автоматического резервного копирования, который можно расширять и настраивать.

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

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

Создание структуры плагина и базовый код

Для начала создадим папку wpbackup-automatic в директории wp-content/plugins. В ней создадим файл wpbackup-automatic.php с базовым описанием плагина:

<?php
/**
 * Plugin Name: WPBackup Автоматическое резервное копирование
 * Description: Плагин для автоматического резервного копирования базы данных и файлов WordPress.
 * Version: 1.0
 * Author: wpbackup.ru
 */

// Защита от прямого запуска
if (!defined('ABSPATH')) {
    exit;
}

Этот минимальный заголовок позволит WordPress распознать плагин. Далее нам нужно добавить функционал для создания бэкапов.

Резервное копирование базы данных: wpbackup_create_db_backup()

Начнём с резервного копирования базы данных. Для этого мы используем функцию, которая извлечёт дамп базы в SQL-файл. В WordPress есть встроенный объект $wpdb для работы с базой, но для бэкапа удобнее использовать native mysqldump или выполнять SQL-запросы с сохранением результата.

Пример функции бэкапа базы данных:

function wpbackup_create_db_backup() {
    global $wpdb;
    $db_name = DB_NAME;
    $db_user = DB_USER;
    $db_password = DB_PASSWORD;
    $db_host = DB_HOST;

    $backup_dir = WP_CONTENT_DIR . '/wpbackup_backups';
    if (!file_exists($backup_dir)) {
        mkdir($backup_dir, 0755, true);
    }

    $filename = 'db_backup_' . date('Y-m-d_H-i-s') . '.sql';
    $filepath = $backup_dir . '/' . $filename;

    // Формируем команду mysqldump
    $command = "mysqldump --user={$db_user} --password={$db_password} --host={$db_host} {$db_name} > {$filepath}";

    exec($command, $output, $return_var);

    if ($return_var === 0) {
        return $filepath;
    } else {
        return false;
    }
}

Эта функция создаёт папку wpbackup_backups в wp-content (если её нет), затем формирует и выполняет команду mysqldump для создания SQL-файла. Обратите внимание на необходимость корректных прав доступа на сервере и установленный mysqldump.

Резервное копирование файлов сайта: wpbackup_create_files_backup()

Кроме базы данных, необходимо резервировать файлы сайта — темы, плагины, загрузки и конфигурационные файлы. Для этого мы можем архивировать папку WordPress в ZIP-архив.

Пример функции создания архива с файлами:

function wpbackup_create_files_backup() {
    $root_path = ABSPATH;
    $backup_dir = WP_CONTENT_DIR . '/wpbackup_backups';
    if (!file_exists($backup_dir)) {
        mkdir($backup_dir, 0755, true);
    }

    $zip_filename = 'files_backup_' . date('Y-m-d_H-i-s') . '.zip';
    $zip_filepath = $backup_dir . '/' . $zip_filename;

    $zip = new ZipArchive();
    if ($zip->open($zip_filepath, ZipArchive::CREATE) !== TRUE) {
        return false;
    }

    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($root_path),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $name => $file) {
        if (!$file->isDir()) {
            $filePath = $file->getRealPath();
            $relativePath = substr($filePath, strlen($root_path));

            // Исключаем папку wpbackup_backups, чтобы не архивировать бэкапы внутри бэкапа
            if (strpos($relativePath, 'wpcontent/wpbackup_backups') !== false) {
                continue;
            }

            $zip->addFile($filePath, $relativePath);
        }
    }

    $zip->close();
    return $zip_filepath;
}

Эта функция создаёт ZIP-архив со всеми файлами WordPress, кроме папки с бэкапами, чтобы избежать рекурсивного архивирования. Используется класс ZipArchive, который должен быть доступен на сервере.

Автоматизация процесса с помощью WP-Cron и уведомления

Чтобы запускать резервное копирование автоматически, используем системный планировщик WordPress — WP-Cron. Создадим событие, которое будет запускать бэкап по расписанию, например, ежедневно в 3 часа ночи.

register_activation_hook(__FILE__, 'wpbackup_activation');
register_deactivation_hook(__FILE__, 'wpbackup_deactivation');

function wpbackup_activation() {
    if (!wp_next_scheduled('wpbackup_daily_backup')) {
        wp_schedule_event(strtotime('03:00:00'), 'daily', 'wpbackup_daily_backup');
    }
}

function wpbackup_deactivation() {
    wp_clear_scheduled_hook('wpbackup_daily_backup');
}

add_action('wpbackup_daily_backup', 'wpbackup_run_backup');

function wpbackup_run_backup() {
    $db_backup = wpbackup_create_db_backup();
    $files_backup = wpbackup_create_files_backup();

    if ($db_backup && $files_backup) {
        wpbackup_send_notification($db_backup, $files_backup);
    }
}

Функция wpbackup_run_backup() запускается ежедневно и создаёт резервные копии базы и файлов. После успешного выполнения можно отправить уведомление на email.

Отправка уведомления с прикреплёнными бэкапами: wpbackup_send_notification()

Для уведомления администратора сайта о результате бэкапа реализуем функцию отправки письма с прикреплёнными файлами:

function wpbackup_send_notification($db_file, $files_file) {
    $to = get_option('admin_email');
    $subject = 'Резервное копирование WordPress завершено';
    $message = "Резервное копирование прошло успешно.\n\nФайлы:\n$db_file\n$files_file";

    $headers = array('Content-Type: text/plain; charset=UTF-8');

    // Используем wp_mail с вложениями
    wp_mail($to, $subject, $message, $headers, array($db_file, $files_file));
}
<

Этот простой способ уведомления помогает своевременно узнавать о создании бэкапов. При необходимости можно интегрировать отправку на облачные хранилища или FTP.

Безопасность и хранение бэкапов

Очень важно обеспечить безопасность резервных копий: хранить их вне публичных директорий, ограничивать доступ по правам, шифровать при необходимости. В примерах выше мы сохраняем бэкапы в wp-content/wpbackup_backups, который можно защитить с помощью .htaccess или правил сервера, чтобы исключить доступ извне.

Также стоит реализовать очистку старых бэкапов, чтобы не занимать много места на диске. Например, сохранять только последние 7 архивов:

function wpbackup_cleanup_old_backups() {
    $backup_dir = WP_CONTENT_DIR . '/wpbackup_backups';
    $files = glob($backup_dir . '/*');
    usort($files, function($a, $b) {
        return filemtime($b) - filemtime($a);
    });

    $max_files = 7;
    $count = 0;

    foreach ($files as $file) {
        $count++;
        if ($count > $max_files) {
            unlink($file);
        }
    }
}

add_action('wpbackup_daily_backup', 'wpbackup_cleanup_old_backups');

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

Заключение

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

Развивая этот плагин, можно добавить поддержку облачных хранилищ (Google Drive, Dropbox), шифрование бэкапов, интерфейс настройки параметров и многое другое. Такой подход даст гибкость и поможет избежать проблем, связанных с потерей данных.

×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее