Зачем создавать собственный плагин для резервного копирования 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), шифрование бэкапов, интерфейс настройки параметров и многое другое. Такой подход даст гибкость и поможет избежать проблем, связанных с потерей данных.