Вопрос или проблема
Есть ли простой способ временно остановить вход для роли пользователя в WordPress?
Например, если у меня есть роль пользователя под названием media, как я могу заблокировать им вход?
Я бы хотел, чтобы на сайте появлялось пользовательское сообщение, например, ‘Сайт на обслуживании’
Чтобы это выглядело так:
Причина в том, что мой сайт полностью закрыт от публичного доступа с помощью этой функции…
// ЗАЩИТА САЙТА
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", оставив при этом доступ для администраторов и редакторов.
Подробное руководство
-
Создание функции для отключения логина:
Создайте в вашем файле
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", возвращает ошибку с сообщением об обслуживании сайта. -
Отображение кастомного сообщения на странице входа:
Вы можете изменить сообщение, которое отобразится пользователю после попытки неудачного входа. Для этого добавьте следующий код:
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, добавляя наш текст об обслуживании сайта.
-
Проверка роли пользователя:
Для того, чтобы остальные пользователи могли продолжать работать, используйте следующие проверочные механизмы:
add_action('get_header', function() { if (!current_user_can('publish_pages')) { die('Сайт на обслуживании'); } });
Этот код позволяет только администраторам и редакторам, которые имеют право публиковать страницы, пользоваться сайтом во время обслуживания.
Заключение
Следуя этим шагам, вы сможете обеспечить временную блокировку для пользователей с ролью "media", не забывая о выводе пользовательского сообщения при их попытке входа. Это полезно для проведения технических работ, поддерживая работоспособность сайта для ключевых ролей.
Запомните, что применение данных инструкций может требовать дополнительных проверок на совместимость с установленными плагинами и настройками вашего сайта. Всегда тестируйте изменения в среде разработки перед внедрением на живом сайте.