wp_maintenance()
Прекращает работу сайта и выводит сообщение о технических работах (сайт в режиме разработки).
Ищет файл .maintenance в корне WordPress (рядом с папкой wp-admin). Этот файл содержит глобальную PHP переменную $upgrading, со значением ― метка времени unix (1374363082) (обычно, когда этот файл был создан).
Если файл существет и значение переменной $upgrading не превышает 10 минут от текущего времени, то при посещении любой страницы сайта, WP выведет сообщение о техническом обслуживании сайта со статусом ответа - 503 Service Unavailable.
По умолчанию этот функционал используется во время обновления кода WordPress или плагинов. Но его можно использвоать и в других случаях, наприме, когда нужно, чтобы сайт находился в недоступном состоянии при «живом» обновлении кода, чтобы код случайно не был запущен визитом посетителя и в тоже время посетитель видел сообщение о том что сайт временно недоступен.
Максимальное время режима разработки (maintenance) ― 10 минут.
Функция срабатывает на очень ранней стадии загрузки WordPress, до константы SHORTINIT.
Если время истекло, но глобальная переменная $upgrading указана в .maintenance, то в админ-панели WP появляется сообщение (см: maintenance_nag()):
An automated WordPress update has failed to complete - please attempt the update again now.
Видимо связано это с тем, что время в переменной проверяется с временем в БД, когда WP обновился.
Текст заглушки по умолчанию можно заменить. Для этого нужно создать файл maintenance.php в директории wp-content. В этом файле нужно описать страницу-заглушку по всем правилам HTML.
Используйте wp_is_maintenance_mode(), чтобы проверить находитель ли вы в режиме обновления.
Внутренняя функция — эта функция рассчитана на использование самим ядром. Не рекомендуется использовать эту функцию в своем коде.
Хуков нет.
Возвращает
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: Создать файл Вариант 2: Создать пустой файл Готово! Обновляем страницу и видим сообщение о техническом обслуживании:.maintenance в корне сайта (каталог где находится папка wp-admin) со следующим кодом:<?php
// метка времени UNIX по истечению которого + 10 минут,
// сайт выйдет из режима разработки.
$upgrading = 1652995051; // time();
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 | Введена. |


