Перенаправлять посетителей на Страницу временного обслуживания


Чтобы мои посетители не видели сломанную версию моего сайта во время обслуживания и чтобы предупредить их об обновлениях, я хотел бы автоматически перенаправить их на страницу временного обслуживания. Я ищу портативное решение, которое можно использовать на любом сайте, без жесткого кодирования URL-адресов.

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

Author: shea, 2014-11-26

2 answers

В WordPress есть встроенная функция для управления режимом обслуживания.

Когда вы обновляете плагин или ядро WordPress с панели управления WP, WordPress переходит в режим обслуживания: он пытается загрузить файл с именем maintenance.php, расположенный в папке содержимого (обычно /wp-content), и если этого файла там нет, WP отображает сообщение по умолчанию.

Я предлагаю вам использовать этот файл, таким образом, вы будете последовательны при обслуживании вручную и при обработке WordPress техническое обслуживание.

Как

  1. Прежде всего создайте файл maintenance.php и поместите туда нужный вам контент. Для стилизации я предлагаю вам поместить CSS в сам файл, используя тег <style>; как правило, это не очень хороший совет, но в данном случае это дает вам возможность использовать файл в режиме обслуживания, управляемом WordPress, когда тема не загружена (и тема может обновляться, поэтому ненадежна).

  2. Сохраните только что созданный файл в папке содержимого (обычно /wp-content).

  3. В вашем 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-адрес входа в адресная строка.

    Если вы используете тему, разработанную третьей стороной, используйте дочернюю тему ; таким образом, вы сможете безопасно обновить тему, не потеряв внесенные изменения.

  4. Если вы хотите включить режим обслуживания, откройте свой wp_config.php и поместите туда:

    define('IN_MAINTENANCE', true);
    

    После этого, когда вы будете готовы снова сделать свой сайт общедоступным, просто удалите эту строку или измените true на false для облегчения повторного включения.

 24
Author: gmazzap, 2018-11-04 09:01:26

Предыдущий ответ является полным и хорошо написанным. В любом случае, если вы похожи на меня и хотите, чтобы все было в одном месте, вы можете поместить следующие строки в файл 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');, так как вышеприведенный не работал для меня.

 2
Author: a.barbieri, 2017-03-10 15:52:22