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

13

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

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

Новый пользователь
источник
скопировать код из плагина?
Марк Каплун
Зачем изобретать велосипед? Используйте плагин. В частности, ограниченный доступ к сайту.
ванкодер
2
Я стараюсь использовать как можно меньше плагинов для моей пользовательской темы. «Меньше значит больше»;)
NewUser

Ответы:

24

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чтобы упростить повторное включение.

Gmazzap
источник
Это очень подробный ответ и отличный способ решить мою проблему с минимальными усилиями! Я попробую это позже и приму ответ, если он работает. Большое спасибо ГМ!
NewUser
Привет GM - я использую пользовательский каталог "wp-content", но я не знаю, как изменить WP_CONTENT_DIR ....., чтобы он работал? лучшее
NewUser
Старая ветка, я знаю ... но на тот случай, если кому-то понадобится такой ответ, это так же просто, как добавить define('WP_CONTENT_DIR','/url/to/define/');в ваш wp-config.phpфайл.
ГМО
@ gmazzap, это потрясающе. Означает ли это, что если и только если вы уже зарегистрированы (скажем, как администратор), вы все равно сможете получать доступ и вносить изменения в / на консоли администратора?
Paranza
@paranza да, правильно.
gmazzap
2

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

a.barbieri
источник
Я вижу в этом смысл, но обратите внимание на несколько вещей - WordPress не будет использовать этот файл обслуживания в директории темы при выполнении своего собственного обслуживания (поэтому было бы неплохо создать wp-content / maintenance.php как ну а потом потребуй () твоей темы одну в нее); Кроме того, определение таких констант, как правило, будет находиться в вашем wp-config.php или в качестве переменной окружения, вместо того, чтобы управлять включением / выключением режима обслуживания с помощью фиксации. :)
Тим Мэлоун
@TimMalone, я согласен. В конце концов, это обходной путь, который будет хорошо работать в течение короткого периода времени, пока вы (разработчик) делаете все обновления.
a.barbieri