Перенаправление пользователей при выходе из WordPress: способы и примеры
Основные способы перенаправления после выхода из WordPress
Как после выхода из WordPress перенаправить пользователя на произвольную страницу?
Наиболее эффективное и безопасное решение - использование фильтра logout_redirect. Этот фильтр срабатывает при выходе пользователя из системы и позволяет указать URL для перенаправления.
Необходимо добавить следующий код в файл functions.php вашей темы (или в код дочерней темы):
add_filter( 'logout_redirect', 'my_custom_logout_redirect', 10, 3 );
function my_custom_logout_redirect( $redirect_to, $requested_redirect_to, $user ) {
// Указываем URL для перенаправления, например, на главную страницу
return home_url();
}
Class wp hook php (класс для хуков wordpress в php)
Пояснения: фильтр принимает три параметра: текущий URL перенаправления, запрошенный URL (если был передан параметр redirect_to) и объект пользователя. Функция возвращает новый URL. Для перенаправления на любую другую страницу можно использовать get_permalink() или просто задать строку.
Возможные проблемы: если указать внешний URL, WordPress может заблокировать редирект через wp_safe_redirect. Для внешних URL используйте wp_redirect, но с осторожностью. Также убедитесь, что код добавлен до инициализации темы, иначе фильтр может не сработать. Типичная ошибка - пропуск проверки на существование пользователя (для выхода он может быть пустым).
Как перенаправить пользователя через экшен wp_logout?
Если требуется выполнить дополнительные действия до перенаправления (например, запись в лог), можно использовать экшен wp_logout. Однако после выхода пользователя стандартный редирект уже происходит, поэтому нужно отменить его и выполнить свой.
Пример кода:
add_action( 'wp_logout', 'my_logout_redirect' );
function my_logout_redirect() {
wp_redirect( home_url( '/login/' ) );
exit();
}
Wp login php loggedout true (перенаправление после выхода wordpress)
Важно: этот код должен быть выполнен до того, как WordPress завершит обработку. После вызова wp_redirect обязательно вызывайте exit(). Проблема этого метода - он срабатывает на все выходы, в том числе из панели администратора. Можно добавить проверку контекста.
Типичная ошибка: если не вызвать exit(), скрипт продолжит выполнение, и стандартный редирект может переопределить ваш. Также этот метод не учитывает возможный редирект, указанный в параметрах URL.
Как использовать JavaScript для перенаправления после выхода?
Данный подход подходит, когда необходимо выполнить редирект после того, как страница выхода уже загружена (например, на странице wp-login.php?loggedout=true).
Можно добавить JavaScript в файл темы или через хук login_footer:
add_action( 'login_footer', 'add_logout_redirect_script' );
function add_logout_redirect_script() {
if ( isset( $_GET['loggedout'] ) && $_GET['loggedout'] == 'true' ) {
echo '';
}
}
Этот код вставляет скрипт на страницу входа, когда пользователь только что вышел. Недостатки: редирект происходит после загрузки страницы, что создает неприятное мигание; метод не сработает, если JavaScript отключен; не рекомендуется для важных редиректов.
Проблемы: если пользователь находится на странице выхода с параметром loggedout, скрипт сработает, но может конфликтовать с другими скриптами. Также не стоит использовать для редиректа на внешние URL.
Как перенаправить пользователя с помощью плагинов?
Для тех, кто не хочет редактировать код, существуют плагины. Например, Peter's Login Redirect или Redirection. Они предоставляют интерфейс для настройки правил редиректа после входа и выхода. В плагине Login/logout redirect можно задать URL для выхода через настройки.
После установки плагина перейдите в раздел Настройки > Login/logout redirect и укажите страницу для перенаправления после выхода. Этот метод прост, но может создавать зависимость от плагина и лишние запросы к базе данных.
Возможные проблемы: конфликты с другими плагинами, несовместимость с кешированием, ограниченные возможности для сложной логики.
Расширенные примеры перенаправления после выхода с пояснениями
Пример 1. Динамический редирект в зависимости от роли пользователя
add_filter( 'logout_redirect', 'role_based_logout_redirect', 10, 3 );
function role_based_logout_redirect( $redirect_to, $requested_redirect_to, $user ) {
if ( ! empty( $user->roles ) ) {
if ( in_array( 'administrator', $user->roles ) ) {
return home_url( '/admin-area/' );
} elseif ( in_array( 'subscriber', $user->roles ) ) {
return home_url( '/subscriber-page/' );
}
}
return home_url(); // по умолчанию
}
Результат: администраторы перенаправляются на /admin-area/, подписчики на /subscriber-page/, остальные на главную.
- Администратор выходит -> переходит на https://example.com/admin-area/ - Подписчик выходит -> переходит на https://example.com/subscriber-page/
Пример 2. Редирект с сохранением предыдущей страницы (referer)
add_filter( 'logout_redirect', 'referer_logout_redirect', 10, 3 );
function referer_logout_redirect( $redirect_to, $requested_redirect_to, $user ) {
// Если есть HTTP_REFERER и он принадлежит нашему сайту, перенаправляем туда
if ( isset( $_SERVER['HTTP_REFERER'] ) ) {
$referer = esc_url_raw( $_SERVER['HTTP_REFERER'] );
if ( strpos( $referer, home_url() ) !== false ) {
return $referer;
}
}
return home_url();
}
Пояснение: код проверяет, откуда пришел пользователь перед выходом. Если реферер с текущего сайта - возвращает его, иначе на главную. Это удобно, когда пользователь выходит со страницы, на которой был, и хочет вернуться на неё после выхода.
Пользователь находился на page.php, нажал "Выйти" -> перенаправление на эту же страницу page.php.
Пример 3. Редирект с добавлением GET-параметра для отображения сообщения
add_filter( 'logout_redirect', 'logout_with_message_redirect', 10, 3 );
function logout_with_message_redirect( $redirect_to, $requested_redirect_to, $user ) {
$url = home_url( '/login/' );
$url = add_query_arg( 'logout', 'success', $url );
return $url;
}
Теперь на странице входа можно обработать параметр logout=success и показать пользователю уведомление.
После выхода пользователь переходит на https://example.com/login/?logout=success
Пример 4. Использование wp_safe_redirect для внешних URL (с проверкой)
add_action( 'wp_logout', 'safe_external_redirect_after_logout' );
function safe_external_redirect_after_logout() {
// Разрешаем только определенные внешние домены
$allowed_hosts = array( 'partner.example.com', 'docs.example.org' );
$target = 'https://partner.example.com/out';
$host = parse_url( $target, PHP_URL_HOST );
if ( in_array( $host, $allowed_hosts ) ) {
wp_safe_redirect( $target );
} else {
wp_redirect( home_url() );
}
exit();
}
Пояснение: wp_safe_redirect по умолчанию блокирует внешние URL, но можно разрешить определённые домены, явно указав их. Иначе нужно использовать wp_redirect.
Пример 5. AJAX-логаут с последующим редиректом (без перезагрузки страницы)
// В front-end скрипте
jQuery.ajax({
url: ajax_object.ajax_url,
data: {
action: 'custom_logout'
},
type: 'POST',
success: function(response) {
if(response.success) {
window.location.href = response.redirect_url;
}
}
});
// В functions.php
add_action( 'wp_ajax_custom_logout', 'handle_ajax_logout' );
function handle_ajax_logout() {
check_ajax_referer( 'logout-ajax-nonce', 'nonce' );
wp_logout();
$redirect = apply_filters( 'logout_redirect', home_url(), '', wp_get_current_user() );
wp_send_json_success( array( 'redirect_url' => $redirect ) );
}
Этот пример позволяет выйти из системы без полной перезагрузки страницы, используя AJAX. После успешного выхода сервер возвращает URL для редиректа, который обрабатывается JavaScript.
Пользователь нажимает кнопку "Выйти" -> появляется спиннер -> страница перенаправляется на заданный URL без перезагрузки.