Включаем режим обслуживания сайта
В заметке будет рассмотрен вопрос (и показано решение) о том, как на сайте, под управлением WordPress, включить режим «технических работ» таким способом, чтобы он легко переключался из админки, без всяких плагинов. Причем для админа будет доступен весь сайт, админка и публичная часть, а всем остальным — показана заглушка
Очень полезная штука, если вам понадобилось закрыть посещаемый сайт на некоторое время от всех, кроме админа системы, чтобы что то протестить или починить. Итак, начнем:
Сперва нужно создать файл .maintenance в корне сайта:
function is_user_logged_in()
{
$loggedin = false;
foreach ((array)$_COOKIE as $cookie => $value) {
if (stristr($cookie, 'wordpress_logged_in_'))
$loggedin = true;
}
return $loggedin;
}
if (!stristr($_SERVER['REQUEST_URI'], '/wp-admin/')
&& !stristr($_SERVER['REQUEST_URI'], '/wp-login.php')
&& !is_user_logged_in()
)
$upgrading = time();
В каталоге wp-content создаем заглушку (ее оформляете как душе угодно) — maintenance.php:
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Ведутся тех. работы</title>
</head>
<body>
<p>Я — заглушка</p>
</body>
</html>
В файле functions.php:
define("themeSettings", serialize(get_option('myThemeName-theme-settings')));
function myThemeNameSetupAdminMenus()
{
require get_template_directory() . '/inc/theme-settings.php';
add_submenu_page('themes.php',
'Настройки темы', 'Настройки темы', 'manage_options',
'myThemeName-theme-settings', 'myThemeNameThemeSettings'
);
}
function get_theme_option($option)
{
$unserialized = unserialize(themeSettings);
if (array_key_exists($option, $unserialized)) {
return $unserialized[$option];
} else {
return null;
}
}
/* Настройки темы */
add_action("admin_menu", "myThemeNameSetupAdminMenus");
function go_tech()
{
$themeSettings = get_option('myThemeName-theme-settings');
$tech = $themeSettings['tech'];
if ($tech == 'n') {
$file_new = ABSPATH . '.maintenance1';
$file_cur = ABSPATH . '.maintenance';
if (file_exists($file_new) && file_exists($file_cur))
unlink($file_cur);
if (file_exists($file_new) && !file_exists($file_cur))
return;
if (!file_exists($file_new) && file_exists($file_cur))
rename($file_cur, $file_new);
if (!file_exists($file_new) && !file_exists($file_cur)) {
return;
}
} else {
$file_new = ABSPATH . '.maintenance';
$file_cur = ABSPATH . '.maintenance1';
if (file_exists($file_new) && file_exists($file_cur))
unlink($file_cur);
if (file_exists($file_new) && !file_exists($file_cur))
return;
if (!file_exists($file_new) && file_exists($file_cur))
rename($file_cur, $file_new);
if (!file_exists($file_new) && !file_exists($file_cur)) {
return;
}
}
}
/* Режим обслуживания */
add_action('init', 'go_tech');
В папке с темой создаем inc/theme-settings.php:
<?php
if (!current_user_can('manage_options')) {
wp_die('Недостаточно прав для просмотра настроек.');
}
function myThemeNameThemeSettings() {
$themeSettings = get_option('myThemeName-theme-settings');
?>
<div class="wrap" xmlns="http://www.w3.org/1999/html">
<h2>Настройки темы</h2>
<form method="post" action="options.php" novalidate="novalidate">
<?php wp_nonce_field('update-options'); ?>
<input type="hidden" name="action" value="update"/>
<table class="form-table">
<tr>
<th>Служебные параметры:</th>
</tr>
<tr>
<th scope="row">
<label>Перевести сайт в режим тех. обслуж. (по умолчанинию: НЕТ)</label>
</th>
<td>
<input type="radio" name="myThemeName-theme-settings[tech]" value="y" <?php if($themeSettings['tech'] == 'y') echo 'checked'; ?>/> ДА
<input type="radio" name="myThemeName-theme-settings[tech]" value="n" <?php if($themeSettings['tech'] == 'n') echo 'checked'; ?>/> НЕТ
</td>
</tr>
</table>
<p class="submit">
<input type="hidden" name="page_options" value="myThemeName-theme-settings"/>
<input name="submit" id="submit" class="button button-primary" value="Сохранить" type="submit">
</p>
</form>
</div>
<?php
}
В принципе, все. В админке, Внешний вид » Настройки темы будет переключалка.
Похожие заметки:
Вывод комментариев с пагинацией
Выводим все комменты на WordPress из базы данных с пагинацией
Веб-разработка
Займусь вашим проектом, если вам нужен специалист в области веб-разработки
Прикручиваем Sphinx к своему поиску на сайте
Установка, задание конфигурации и запуск службы на Ubuntu для высокоскоростного поиска. Быстрый гайд
Перед тем как писать комментарии, рекомендую ознакомиться:
5
Олег сказал 20-02-2017 в 11:15
Поясни по файлу .maintenance.
Зачем в нём какая-то непонятная функция, названная о проверке авторизации, с проверкой на существование куки, которую с лёгкостью можно подделать.
Зачем объявляется переменная $upgrading?
Рейтинг комментария (1)
Админ
Роман Жариков сказал 20-02-2017 в 23:28
В ответ на комментарии автора ОлегДело в том, что при старте, вордпресс автоматически ищет файл .maintenance в корне. Этот файл содержит переменную $upgrading, с данными, когда он был создан. Если файл был создан меньше 10 минут назад, WP выведет сообщение о техническом обслуживании сайта.
Верное замечание насчет куки. Это проверка авторизации, если кука есть, значит юзер вошел и для его режим тех. обсл. не вкл. И наоборот. Согласен, что это костыль (с кукой), но тут все дело в том, что проверка maintenance идет на очень ранней стадии, когда большинство функции вп еще не работают. Поэтому, в файле .maintenance нельзя к примеру заюзать более лучшую функцию вп на проверку авторизации, допустим админа:
Рейтинг комментария (0)
Олег сказал 21-02-2017 в 01:28
В ответ на комментарии автора Роман ЖариковА если больше?
Почему бы не подключить нужные функции руками?
Рейтинг комментария (-2)
Админ
Роман Жариков сказал 21-02-2017 в 07:26
В ответ на комментарии автора ОлегВот код главной функции, отвечающей за режим введения сайта в техническое обслуживание. Из него ты можешь с легкостью понять сам, что будет по истечению 10 мин. Версия wp — 4.7.2, wp-includes/load.php стр. 175:
Рейтинг комментария (0)
Админ
Роман Жариков сказал 21-02-2017 в 08:33
В ответ на комментарии автора ОлегМожно заморочиться на эту тему и, возможно, когда нибудь, я обновлю эту заметку.
Рейтинг комментария (-1)