Временно отключите вход для пользовательской роли и замените его сообщением.

Вопрос или проблема

Есть ли простой способ временно остановить вход для роли пользователя в WordPress?

Например, если у меня есть роль пользователя под названием media, как я могу заблокировать им вход?

Я бы хотел, чтобы на сайте появлялось пользовательское сообщение, например, ‘Сайт на обслуживании’

Чтобы это выглядело так:

https://i.sstatic.net/TgAia.jpg

Причина в том, что мой сайт полностью закрыт от публичного доступа с помощью этой функции…

// ЗАЩИТА САЙТА
add_action('get_header', 'wpq_member_only_site');
function wpq_member_only_site() {
    // авторизованные пользователи или визиты на указанную страницу допустимы
    if ( !is_user_logged_in() ) {
        
        $redirect_after_login = get_home_url();
        
        // URL для входа/регистрации
        $login_url = wp_login_url( $redirect_after_login );
                
        // перенаправление посетителей
        wp_redirect( $login_url, 302 );
        exit;
    }
}

Но мне нужно провести обслуживание, и я ищу простой способ заблокировать всех пользователей с ролью media.

Это потому, что я хочу, чтобы администраторы и редакторы имели доступ, но не media.

С немного изучив и потрудившись, я смог скомбинировать разную помощь и создать эти 2 функции…

// РЕЖИМ ОБСЛУЖИВАНИЯ
function site_maintenance() {
    if ( current_user_can('media') || current_user_can('genpo') ) {

       $logout_url = wp_login_url().'?mode=maintainance';
       wp_logout();
       wp_redirect( $logout_url, 302 );

    }     
}
add_action('get_header', 'site_maintenance');

// ПОЛЬЗОВАТЕЛЬСКИЕ СООБЩЕНИЯ ДЛЯ ВХОДА
function my_login_message() {

    if( $_GET['mode'] == 'maintainance' ){
        $message="<p class="message"><b>Сайт на обслуживании.</b></p>";
        return $message;
    }

}
add_filter('login_message', 'my_login_message');

Добавьте проверку возможности, которой обладают администраторы и редакторы:

add_action( 'get_header', 'wpse81659_maintenance' );
function wpse81659_maintenance() {
    if ( ! current_user_can( 'publish_pages' ) || ! is_user_logged_in() )
        die( 'Сайт на обслуживании' );
}
add_filter( 'authenticate', 'restrict_media_role_authenticate', 99 );
function restrict_media_role_authenticate( $user, $username, $password ){
    if ( in_array( 'media', (array) $user->roles ) ) {
        return new WP_Error( 'denied', "Сайт на обслуживании." );
    }
    return $user;
}

Ответ или решение

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

Подробное руководство

  1. Создание функции для отключения логина:

    Создайте в вашем файле functions.php функцию, которая будет блокировать пользователей с ролью "media" и перенаправлять их на страницу входа с сообщением "Сайт на обслуживании". В этом решении применяются хуки WordPress.

    add_filter('authenticate', 'restrict_media_role_authenticate', 99, 3);
    function restrict_media_role_authenticate( $user, $username, $password ) {
       if (is_wp_error($user)) {
           return $user;
       }
    
       if (is_a($user, 'WP_User') && in_array('media', (array) $user->roles)) {
           return new WP_Error('denied', __("Сайт на обслуживании.", "text-domain"));
       }
    
       return $user;
    }

    Данный код добавляет фильтр authenticate, который проверяет роль пользователя и в случае, если у него роль "media", возвращает ошибку с сообщением об обслуживании сайта.

  2. Отображение кастомного сообщения на странице входа:

    Вы можете изменить сообщение, которое отобразится пользователю после попытки неудачного входа. Для этого добавьте следующий код:

    add_filter('login_message', 'custom_login_message');
    function custom_login_message($message) {
       if (isset($_GET['denied'])) {
           $message = '<p class="message">' . __('Сайт на обслуживании.', 'text-domain') . '</p>';
       }
       return $message;
    }

    Этот фильтр изменяет стандартное сообщение на странице входа в WordPress, добавляя наш текст об обслуживании сайта.

  3. Проверка роли пользователя:

    Для того, чтобы остальные пользователи могли продолжать работать, используйте следующие проверочные механизмы:

    add_action('get_header', function() {
       if (!current_user_can('publish_pages')) {
           die('Сайт на обслуживании');
       }
    });

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

Заключение

Следуя этим шагам, вы сможете обеспечить временную блокировку для пользователей с ролью "media", не забывая о выводе пользовательского сообщения при их попытке входа. Это полезно для проведения технических работ, поддерживая работоспособность сайта для ключевых ролей.

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

Оцените материал
Добавить комментарий

Капча загружается...