Перенаправление пользователей при выходе из WordPress: способы и примеры

Раздел: Веб-разработка -> 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 и укажите страницу для перенаправления после выхода. Этот метод прост, но может создавать зависимость от плагина и лишние запросы к базе данных.

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

- Localhost wp admin php (администрирование wordpress на localhost)
- Wp admin edit php (редактирование php в админке wordpress)
- Wp admin php (администрирование wordpress)

Расширенные примеры перенаправления после выхода с пояснениями

Пример 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 без перезагрузки.

Перенаправление после выхода WordPress - comments

En
Wp login php loggedout true (php)