WordPress как на ладони

wp_maintenance()WP 3.0.0

Прекращает работу сайта и выводит сообщение о технических работах (сайт в режиме разработки).

Ищет файл .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.

maintenetce2

Видимо связано это с тем, что время в переменной проверяется с временем в БД, когда WP обновился.

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

Хуков нет.

Возвращает

null. Выводит на экран текст заглушки и останавливает работу скрипта (сайта).

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

wp_maintenance();

Примеры

1

#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' );
0

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

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

Чтобы включить такой режим нужно:

Вариант 1:

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

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

Вариант 2:

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

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

Готово!

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

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

0

#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>

При обновлении сайта, наше сообщение о недоступности сайта будет изменено и мы увидим такой текст:

maintenetce

Список изменений

С версии 3.0.0 Введена.

Код wp_maintenance() WP 6.6.2

function wp_maintenance() {
	// Return if maintenance mode is disabled.
	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(
		__( 'Briefly unavailable for scheduled maintenance. Check back in a minute.' ),
		__( 'Maintenance' ),
		503
	);
}
1 комментарий
    Войти