wplearn.ru wordpress WP Learn

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

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

Почему важно делать резервные копии WordPress?

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

  • Файлы сайта — темы, плагины, медиафайлы;
  • Базу данных — все записи, страницы, настройки;
  • Хранение копий в безопасном месте — удаленный сервер, облако, локальный компьютер.

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

Основные подходы к резервному копированию без плагинов

Чтобы сделать резервные копии WordPress без плагинов, нужно автоматизировать две задачи:

  1. Экспорт файлов сайта в архив;
  2. Экспорт базы данных в SQL-файл.

Для автоматизации мы воспользуемся PHP-скриптом, который будет запускаться по расписанию через cron на сервере. Ниже мы подробно рассмотрим оба шага и приведем пример готового скрипта.

Архивирование файлов WordPress с помощью PHP

Для архивации файлов можно использовать класс ZipArchive, встроенный в PHP (убедитесь, что он включен на вашем сервере).

Основная идея — пройтись рекурсивно по папке сайта и добавить все файлы в zip-архив.

Вот пример функции для архивации каталога:

function wplearn_zipDirectory($source, $destination) {
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

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

    $source = realpath($source);
    if (is_dir($source)) {
        $files = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($source),
            RecursiveIteratorIterator::LEAVES_ONLY
        );

        foreach ($files as $name => $file) {
            if (!$file->isDir()) {
                $filePath = $file->getRealPath();
                $relativePath = substr($filePath, strlen($source) + 1);
                $zip->addFile($filePath, $relativePath);
            }
        }
    } else if (is_file($source)) {
        $zip->addFile($source, basename($source));
    }

    return $zip->close();
}

Эта функция создаст zip-архив с полным содержимым каталога WordPress.

Экспорт базы данных WordPress в SQL-файл

Для создания дампа базы данных можно использовать встроенную функцию mysqldump, если есть доступ к командной строке, или написать PHP-функцию, которая экспортирует таблицы вручную. Рассмотрим простой способ через PHP с использованием объекта PDO или mysqli.

Ниже пример функции, которая экспортирует всю базу данных в файл:

function wplearn_exportDatabase($host, $user, $pass, $dbname, $outputFile) {
    $mysqli = new mysqli($host, $user, $pass, $dbname);
    if ($mysqli->connect_error) {
        return false;
    }

    $mysqli->set_charset('utf8');
    $tables = [];
    $result = $mysqli->query('SHOW TABLES');
    while ($row = $result->fetch_array()) {
        $tables[] = $row[0];
    }

    $sqlDump = '';

    foreach ($tables as $table) {
        // Создаем DROP TABLE
        $sqlDump .= "DROP TABLE IF EXISTS `$table`;
";

        // Создаем CREATE TABLE
        $row2 = $mysqli->query("SHOW CREATE TABLE `$table`")->fetch_assoc();
        $sqlDump .= $row2['Create Table'] . ";

";

        // Вставляем данные
        $result2 = $mysqli->query("SELECT * FROM `$table`");
        $columnCount = $result2->field_count;

        while ($rowData = $result2->fetch_row()) {
            $sqlDump .= "INSERT INTO `$table` VALUES(";
            $valuesArr = [];
            foreach ($rowData as $value) {
                if (is_null($value)) {
                    $valuesArr[] = 'NULL';
                } else {
                    $valuesArr[] = "'" . $mysqli->real_escape_string($value) . "'";
                }
            }
            $sqlDump .= implode(',', $valuesArr) . ");
";
        }
        $sqlDump .= "
";
    }

    file_put_contents($outputFile, $sqlDump);
    $mysqli->close();
    return true;
}

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

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

Объединим наши функции в один скрипт, который создаст архив файлов и дамп базы, а затем сохранит их в папке wp-content/backups.

define('WPLEARN_BACKUP_DIR', __DIR__ . '/wp-content/backups');

if (!file_exists(WPLEARN_BACKUP_DIR)) {
    mkdir(WPLEARN_BACKUP_DIR, 0755, true);
}

$date = date('Y-m-d_H-i-s');
$zipFile = WPLEARN_BACKUP_DIR . "/wplearn-backup-files-{$date}.zip";
$sqlFile = WPLEARN_BACKUP_DIR . "/wplearn-backup-db-{$date}.sql";

// Архивируем файлы
$filesBackup = wplearn_zipDirectory(__DIR__, $zipFile);

// Получаем данные для подключения из wp-config.php
require_once __DIR__ . '/wp-config.php';

db_user = defined('DB_USER') ? DB_USER : '';
db_password = defined('DB_PASSWORD') ? DB_PASSWORD : '';
db_name = defined('DB_NAME') ? DB_NAME : '';
db_host = defined('DB_HOST') ? DB_HOST : '';

// Экспорт базы данных
$dbBackup = wplearn_exportDatabase(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, $sqlFile);

if ($filesBackup && $dbBackup) {
    echo "Резервное копирование завершено успешно.\nФайлы: $zipFile\nБаза данных: $sqlFile";
} else {
    echo "Ошибка при создании резервной копии.";
}

// Функции wplearn_zipDirectory и wplearn_exportDatabase из предыдущих примеров

Этот скрипт можно сохранить в корне сайта, например, как backup.php, и запускать по расписанию через cron.

Настройка cron для автоматического запуска резервного копирования

Чтобы автоматизировать запуск скрипта, добавьте в cron следующую строку (пример для запуска ежедневно в 3 часа ночи):

0 3 * * * /usr/bin/php /path/to/your/site/backup.php > /dev/null 2>&1

Обязательно укажите правильный путь к PHP и к вашему скрипту. Вывод перенаправляется в null, чтобы не засорять почту сервера.

Дополнительные рекомендации и безопасность

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

2. Храните копии вне корня сайта, например, на другом сервере или в облаке.

3. Для защиты скрипта backup.php ограничьте доступ по IP или защитите паролем.

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

Вывод

Создание автоматических резервных копий WordPress без плагинов — вполне выполнимая задача, особенно если вы хотите контролировать процесс и минимизировать сторонние зависимости. Используя PHP и cron, можно организовать надежное резервное копирование как файлов, так и базы данных с минимальными усилиями.

×
День SEO
Время сделать подарок своему WordPress!
-20% на премиум

шаблоны и плагины

Порадуй свой сайт ⋙