wp_maintenance()
Прекращает работу сайта и выводит сообщение о технических работах (сайт в режиме разработки).
Ищет файл .maintenance
в корне WordPress (рядом с папкой wp-admin, обычно это корень сайта). Этот файл содержит переменную $upgrading
, с данными, когда он был создан.
Если .maintenance
был создан меньше 10 минут назад, при посещении любой страницы сайта, WP выведет сообщение о техническом обслуживании сайта. Время в $upgrading указывается в формате unix (1374363082).
Используйте wp_is_maintenance_mode(), чтобы проверить находитель ли вы в режиме обновления.
Обычно этот функционал используется во время обновления сайта. Но его можно «прикрутить» к другим случаям, когда нужно чтобы сайт находился в недоступном для просмотра режиме. Например при «живом» обновлении кода, чтобы код случайно не был запущен визитом посетителя.
Текст заглушки по умолчанию можно заменить. Для этого нужно создать файл maintenance.php
в директории wp-content. В этом файле нужно описать страницу-заглушку по всем правилам HTML.
Функция срабатывает на очень ранней стадии загрузки WordPress, до константы SHORTINIT.
Если время истекло, но глобальная переменная $upgrading указана в .maintenance, то в админ-панели WP появляется сообщение:
An automated WordPress update has failed to complete - please attempt the update again now.
Видимо связано это с тем, что время в переменной проверяется с временем в БД, когда WP обновился.
Внутренняя функция — эта функция рассчитана на использование самим ядром. Не рекомендуется использовать эту функцию в своем коде.
Хуков нет.
Возвращает
null
. Выводит на экран текст заглушки и останавливает работу скрипта (сайта).
Использование
wp_maintenance();
Примеры
#1 Функция включения и отключения режима разработки
По умолчанию такая функция в WordPress находится в методе класса WP_Upgrader
- WP_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 ) {} // reload method to do nothing } ); $wp_upgrader->maintenance_mode( true ); // --------------- // do your upgrade // --------------- $wp_upgrader->maintenance_mode( false );
Это не всегда удобно.
Поэтому давайте напишем свою функцию, которая позволит удобно включить и отключать режим тех-обслуживания сайта:
/** * Enables or Disables the WP maintenance mode. * * @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 ) { /** @noinspection ForgottenDebugOutputInspection */ wp_die( 'WP_Filesystem need to be direct type.' ); } } $maintenance_file = $wp_filesystem->abspath() . '.maintenance'; // Create maintenance file to signal that we are upgrading. if( 'on' === $action ){ $maintenance_string = sprintf( '<?php $upgrading = %d; ?>', time() ); $wp_filesystem->delete( $maintenance_file ); $wp_filesystem->put_contents( $maintenance_file, $maintenance_string ); } // Remove maintenance file, we're done with potential site-breaking changes. else { $wp_filesystem->delete( $maintenance_file ); } }
Пример использования функции:
wpkama_wp_maintenance_mode( 'on' ); sleep(6); // симулируем какие-то действия wpkama_wp_maintenance_mode( 'off' );
#2 Переводим сайт в режим обслуживание (обновления, разработки)
При обновлении кода на сайте, рекомендуется переводить сайт в режим обслуживания (заблокировать на время обновления), чтобы внезапные посещения пользователей не могли повлиять на процесс обновления файлов.
Чтобы включить такой режим нужно:
Вариант 1:
Создать файл .maintenance
в корне сайта (каталог где находится папка wp-admin) со следующим кодом:
<?php // метка времени UNIX по истечению которого + 10 минут, // сайт выйдет из режима разработки. $upgrading = 1652995051; // time();
Вариант 2:
Создать пустой файл ABSPATH . '.maintenance'
и вручную на раннем этапе, например в файле wp-config.php указать глобальную переменную
// метка времени UNIX по истечению которого + 10 минут, сайт выйдет из режима разработки. $GLOBALS['upgrading'] = 1652995051; // time();
Готово!
Обновляем страницу и видим сообщение о техническом обслуживании:
#3 Изменим текст сообщения:
Создадим файл /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' ); // большинство функций WP не работают ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"<?php if ( is_rtl() ) echo ' dir="rtl"'; ?>> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Техническое обслуживание</title> </head> <body> <div style="max-width:800px; margin:50px auto; text-align:center;"> <h1>Сайт находится на техническом обслуживании, работа будет восстановлена через несколько минут.</h1> <h2>Извините за неудобства.</h2> </div> </body> </html>
При обновлении сайта, наше сообщение о недоступности сайта будет изменено и мы увидим такой текст:
Список изменений
С версии 3.0.0 | Введена. |