Перенаправлення відвідувачів на сторінку тимчасового обслуговування


13

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

Увійшли адміністратори (або інший рівень вибору користувача) повинні отримати повний доступ до бек-енд-фронту. Існує дуже багато плагінів, які пропонують цю функціональність, але я шукаю рішення лише для коду.


скопіювати код із плагіна?
Марк Каплун

Навіщо винаходити колесо? Використовуйте плагін. Зокрема, обмежений доступ до сайту.
vancoder

2
Я намагаюся використовувати якомога менше плагінів для власної власної теми. "Менше більше";)
НовийUser

Відповіді:


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(). Дивіться Codex для отримання додаткової інформації.

    Можливо, ви можете додати maintenance.phpпосилання на сторінку входу; таким чином користувач, який не входить у систему, може натискати на нього без необхідності вручну вводити URL-адресу входу в адресний рядок.

    Якщо ви використовуєте тему, розроблену третьою стороною, використовуйте дочірню тему ; таким чином ви зможете безпечно оновити тему, не втрачаючи змін.

  4. Коли ви хочете ввімкнути режим технічного обслуговування, відкрийте свій wp_config.phpі поставте там:

    define('IN_MAINTENANCE', true);

    Після цього, коли ви будете готові знову оприлюднити свій сайт, просто видаліть цей рядок або змініть trueна falseдля легшого повторного ввімкнення.


Це дуже детальна відповідь і чудовий спосіб вирішити мою проблему з меншими зусиллями! Я спробую це пізніше і прийму відповідь, якщо він працює. Велике спасибі GM!
NewUser

Привіт GM - я використовую спеціальний каталог з назвою "wp-content", але я поняття не маю, як змінити WP_CONTENT_DIR ..... щоб він працював? кращий
NewUser

Я знаю старий потік, але на всякий випадок, коли комусь потрібна відповідь, це так просто, як додавання define('WP_CONTENT_DIR','/url/to/define/');у ваш wp-config.phpфайл.
gmo

@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');так, як той, що був вище, не працював для мене.


Я бачу сенс у цьому, але зауважте кілька речей - WordPress не буде використовувати цей файл технічного обслуговування в темі dir під час власного обслуговування (тому було б хорошою ідеєю створити wp-content / održavanje.php як добре, а потім вимагайте () свою тему в неї); також визначаючи такі константи, як правило, сидітимуть у вашому wp-config.php або як змінна середовище, а не керувати режимом технічного обслуговування, увімкненням і вимкненням, роблячи коміти. :)
Тім Малоун

@TimMalone, я згоден. Зрештою, це рішення, яке буде добре працювати протягом короткого періоду часу, тоді як ви (розробник) будете робити всі оновлення.
a.barbieri
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.