Перенаправлять посетителей на Страницу временного обслуживания
Чтобы мои посетители не видели сломанную версию моего сайта во время обслуживания и чтобы предупредить их об обновлениях, я хотел бы автоматически перенаправить их на страницу временного обслуживания. Я ищу портативное решение, которое можно использовать на любом сайте, без жесткого кодирования URL-адресов.
Зарегистрированные администраторы (или другой уровень пользователя по выбору) должны получить полный доступ к серверной и интерфейсной части. Существует множество плагинов, которые предложите эту функциональность, но я ищу решение только для кода.
2 answers
В WordPress есть встроенная функция для управления режимом обслуживания.
Когда вы обновляете плагин или ядро WordPress с панели управления WP, WordPress переходит в режим обслуживания: он пытается загрузить файл с именем maintenance.php
, расположенный в папке содержимого (обычно /wp-content
), и если этого файла там нет, WP отображает сообщение по умолчанию.
Я предлагаю вам использовать этот файл, таким образом, вы будете последовательны при обслуживании вручную и при обработке WordPress техническое обслуживание.
Как
Прежде всего создайте файл
maintenance.php
и поместите туда нужный вам контент. Для стилизации я предлагаю вам поместить CSS в сам файл, используя тег<style>
; как правило, это не очень хороший совет, но в данном случае это дает вам возможность использовать файл в режиме обслуживания, управляемом WordPress, когда тема не загружена (и тема может обновляться, поэтому ненадежна).Сохраните только что созданный файл в папке содержимого (обычно
/wp-content
).-
В вашем
functions.php
поместите:add_action( 'wp_loaded', function() { global $pagenow; if( defined( 'IN_MAINTENANCE' ) && IN_MAINTENANCE && $pagenow !== 'wp-login.php' && ! is_user_logged_in() ) { header( 'HTTP/1.1 Service Unavailable', true, 503 ); header( 'Content-Type: text/html; charset=utf-8' ); header( 'Retry-After: 3600' ); if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) { require_once( WP_CONTENT_DIR . '/maintenance.php' ); } die(); } });
Этот код проверит константу (см. Следующий пункт), и если пользователь не вошел в систему, загрузите файл, созданный в точке №1, и выйдите.
Если вы хотите разрешить только пользователям с определенными возможностями, используйте
current_user_can('capability_to_allow')
вместоis_user_logged_in()
. Смотрите Кодекс для получения дополнительной информации.Возможно, вы можете добавить в
maintenance.php
ссылку на страницу входа в систему; таким образом, незарегистрированный пользователь может щелкнуть по ней без необходимости вручную вводить URL-адрес входа в адресная строка.Если вы используете тему, разработанную третьей стороной, используйте дочернюю тему ; таким образом, вы сможете безопасно обновить тему, не потеряв внесенные изменения.
-
Если вы хотите включить режим обслуживания, откройте свой
wp_config.php
и поместите туда:define('IN_MAINTENANCE', true);
После этого, когда вы будете готовы снова сделать свой сайт общедоступным, просто удалите эту строку или измените
true
наfalse
для облегчения повторного включения.
Предыдущий ответ является полным и хорошо написанным. В любом случае, если вы похожи на меня и хотите, чтобы все было в одном месте, вы можете поместить следующие строки в файл function.php
и создать файл maintenance.php
в каталоге вашей темы.
Это особенно полезно, если ваш репозиторий Git указывает только на каталог темы.
add_action( 'wp_loaded', function()
{
global $pagenow;
// - - - - - - - - - - - - - - - - - - - - - -
// Turn on/off you Maintenance Mode (true/false)
define('IN_MAINTENANCE', true);
// - - - - - - - - - - - - - - - - - - - - - -
if(
defined( 'IN_MAINTENANCE' )
&& IN_MAINTENANCE
&& $pagenow !== 'wp-login.php'
&& ! is_user_logged_in()
) {
header('HTTP/1.1 503 Service Temporarily Unavailable');
header( 'Content-Type: text/html; charset=utf-8' );
if ( file_exists( get_template_directory() . '/maintenance.php' ) ) {
require_once( get_template_directory() . '/maintenance.php' );
}
die();
}
});
ПРИМЕЧАНИЯ
Я изменил заголовок на header('HTTP/1.1 503 Service Temporarily Unavailable');
, так как вышеприведенный не работал для меня.