Функция WP_MAINTENANCE() в WordPress: как включить и использовать

WP_MAINTENANCE() │ WP 3.0.0

Функция WP_MAINTENANCE() останавливает работу сайта и отображает сообщение о том, что он находится в режиме обслуживания (непродолжительном обновлении).

Как это работает

Функция проверяет наличие файла .maintenance в корне WordPress (рядом с папкой wp-admin). Этот файл содержит глобальную PHP-переменную $upgrading, в которой записано значение временной метки Unix, например, 1374363082, обозначающей время создания файла.

Если файл существует и значение переменной $upgrading не превышает 10 минут от текущего времени, при переходе на любой раздел сайта WordPress будет показывать сообщение о его временной недоступности.

Зображение повідомлення про обслуговування

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

Максимальное время работы в режиме обслуживания — 10 минут.

Функция запускается на очень раннем этапе загрузки WordPress, до постоянной переменной SHORTINIT.

Если время вышло, но глобальная переменная $upgrading задана в файле .maintenance, то в административной панели WordPress появляется сообщение:

Автоматическое обновление WordPress не было завершено - пожалуйста, попробуйте выполнить обновление еще раз.

Зображення повідомлення про помилку

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

Изменение текста сообщения о обслуживании

Вы можете заменить текст по умолчанию. Для этого нужно создать файл maintenance.php в директории wp-content. В этом файле вы должны описать страницу с сообщением, следуя всем правилам HTML.

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

Важное замечание: эта функция предназначена только для внутреннего использования в ядре WordPress. Не рекомендуется использовать эту функцию в вашем коде.

Возврат значения

Функция ничего не возвращает и просто отображает текст сообщения, останавливая выполнение скрипта (сайта).

Использование

Чтобы активировать режим обслуживания, вызовите функцию:

wp_maintenance();

Примеры использования

1. Перевод сайта в режим обслуживания (обновления, разработка)

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

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

Вариант 1:

Создайте файл .maintenance в корне сайта (в директории, где находится папка wp-admin), с следующим содержимым:

<?php
// Временная метка UNIX, после которой
// через + 10 минут сайт выйдет из режима обслуживания.
$upgrading = 1652995051; // time();

Вариант 2:

Создайте пустой файл ABSPATH . '.maintenance', и на раннем этапе, например, в файле wp-config.php, укажите глобальную переменную $upgrading:

// Временная метка UNIX, после которой + 10 минут,
// сайт выйдет из режима обслуживания.
$GLOBALS['upgrading'] = 1652995051; // time();

Готово! Обновите страницу и увидите сооб��ение о техническом обслуживании:

Сообщение о техническом обслуживании

Сайт временно закрыт на техническое обслуживание. Вернитесь через минуту.

2. Изменение текста сообщения о техническом обслуживании

Создайте файл /wp-content/maintenance.php со следующим кодом:

<?php
wp_load_translations_early();

$protocol = $_SERVER["SERVER_PROTOCOL"];
if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol ) {
$protocol = 'HTTP/1.0';
}
header( "$protocol 503 Service Unavailable", true, 503 );
header( 'Content-Type: text/html; charset=utf-8' );
header( 'Retry-After: 600' );
?>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"<?php if ( is_rtl() ) echo ' dir="rtl"'; ?>>



Обслуживание

Сайт находится на обслуживании. Корректная работа будет восстановлена через несколько минут.

Приносим извинения за неудобства.

Когда сайт обновится, наше сообщение об его недоступности будет изменено на указанный выше текст.

3. Функция для включения или отключения режима обслуживания

По умолчанию такая функция в WordPress находится в методе класса WP_UpgraderWP_Upgrader::maintenance_mode(). Чтобы вызвать её, нужно создать экземпляр этого класса, который зависит от другого класса WP_Upgrader_Skin.

Пример кода:

require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader-skin.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

$wp_upgrader = new WP_Upgrader(new class extends WP_Upgrader_Skin {
public function feedback($feedback, ...$args) {} // метод, который ничего не делает
});

$wp_upgrader->maintenance_mode(true);

// ---------------
// выполняем обновление
// ---------------

$wp_upgrader->maintenance_mode(false);

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

/**

  • Включает или отключает режим обслуживания WP.
  • @param string $action 'on' | 'off'
  • @return void
    */
    function wpkama_wp_maintenance_mode($action = 'on') {
    global $wp_filesystem;

    if (!$wp_filesystem) {
    require_once ABSPATH . 'wp-admin/includes/file.php';
    WP_Filesystem();

    if ('direct' !== $wp_filesystem->method) {
        wp_die('WP_Filesystem должен быть типа direct.');
    }

    }

    $maintenance_file = $wp_filesystem->abspath() . '.maintenance';

    // Создаем файл обслуживания, чтобы сигнализировать о том, что мы обновляем.
    if ('on' === $action) {
    $maintenance_string = sprintf('<?php $upgrading = %d; ?>', time());

    $wp_filesystem->delete($maintenance_file);
    $wp_filesystem->put_contents($maintenance_file, $maintenance_string);

    }
    // Удаляем файл обслуживания, мы завершили изменения.
    else {
    $wp_filesystem->delete($maintenance_file);
    }
    }

Пример использования функции:

wpkama_wp_maintenance_mode('on');

sleep(6); // имитируем некоторые действия

wpkama_wp_maintenance_mode('off');

Теперь вы можете удобно управлять режимом обслуживания на своем сайте.

Изменения в версии

С версии 3.0.0 добавлена поддержка этой функции.

Структура функции WP_MAINTENANCE

Функция wp_maintenance() выполняет следующие шаги:

  1. Если режим обслуживания отключен, функция ничего не делает.
  2. Загружает файл maintenance.php, если он существует.
  3. Если файл не найден, отображает стандартное сообщение о техническом обслуживании.
function wp_maintenance() {
    // Возвращаем, если режим обслуживания отключён.
    if (!wp_is_maintenance_mode()) {
        return;
    }

    if (file_exists(WP_CONTENT_DIR . '/maintenance.php')) {
        require_once WP_CONTENT_DIR . '/maintenance.php';
        die();
    }

    require_once ABSPATH . WPINC . '/functions.php';
    wp_load_translations_early();

    header('Retry-After: 600');

    wp_die(
        __('Временно недоступен для планового обслуживания. Проверьте через минуту.'),
        __('Обслуживание'),
        503
    );
}

Теперь вы знаете, как включить и управлять режимом обслуживания на своем сайте WordPress!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *