Перенаправление пользователя, если он авторизован
Данный скрипт отлично работает и перенаправляет неавторизованных пользователей на страницу входа, если они пытаются получить доступ к странице моего аккаунта:
// Перенаправляем на страницу входа, если пользователь не авторизован
add_action( 'template_redirect', function() {
if ( is_user_logged_in() || ! is_page() ) return;
$logged_in_restricted = array( 5156, 000 ); // ID всех ограниченных страниц для неавторизованных пользователей
if ( in_array( get_queried_object_id(), $logged_out_restricted ) ) {
wp_redirect( site_url( '/login' ) ); // страница перенаправления при выполнении условия
exit();
}
});
Как я могу использовать ту же логику скрипта, но нацелиться на авторизованных пользователей в качестве дополнительного скрипта? Например, теперь я хочу перенаправлять авторизованных пользователей на страницу "мой-аккаунт", если они пытаются перейти на страницы входа/регистрации. Вот пример:
// Перенаправляем со страниц входа и регистрации на страницу аккаунта, если пользователь авторизован
add_action( 'template_redirect', function() {
if ( !is_user_logged_in() || ! is_page() ) return;
$logged_in_restricted = array( 3156, 4532 ); // ID всех ограниченных страниц для авторизованных пользователей
if ( in_array( get_queried_object_id(), $logged_in_restricted ) ) {
wp_redirect( site_url( '/my-account' ) ); // страница перенаправления при выполнении условия
exit();
}
});
Я понимаю, что is_user_logged_out
не существует. Что я могу использовать для этого?

Метод 1
Вы можете использовать фильтр login_redirect
для добавления URL перенаправления после входа.
Фильтр принимает 3 аргумента:
// смотрите /wp-login.php
/**
* Фильтрует URL для перенаправления после входа.
*
* @since 3.0.0
*
* @param string $redirect_to URL назначения для перенаправления.
* @param string $requested_redirect_to Запрошенный URL перенаправления, переданный как параметр.
* @param WP_User|WP_Error $user Объект WP_User при успешном входе, иначе объект WP_Error.
*/
Следующий пример просто передает URL, но вы также можете передать аргумент $user и перенаправлять в зависимости от разных пользователей.
add_filter( 'login_redirect', 'ws365094_logout_redirect_to', 10, 3 );
function ws365094_logout_redirect_to( $redirect_to_url, $requested_redirect_to, $user ) {
// любая дополнительная логика
return site_url( '/my-account' ); // просто передайте этот URL, после входа WordPress перенаправит пользователя
}
Метод 2
Если у вас есть собственная форма входа, вы можете передать переменную "redirect_to", так как wp-login.php проверит её наличие. Если вы перенаправляете всех на один и тот же URL, этот метод проще, чем первый.
<input type="hidden" name="redirect_to" value="somewhere_url" />
Для вашего оригинального метода выхода можно также использовать фильтр logout_redirect
для добавления URL перенаправления после выхода вместо действия template_redirect
. template_redirect
довольно универсален, но чаще используется для перенаправления на определенные шаблоны (управление шаблонами). Просто дополнительная заметка для справки.
Сравнение последовательности между template_redirect
и login_redirect
Согласно последовательности загрузки, по умолчанию после входа WordPress перенаправляет пользователя на определенную страницу, чтобы работали куки, о чем я уже отвечал здесь ранее.
Вход -> Перенаправление -> Перенаправление шаблона (каноническое), обычно выполняется redirect_canonical(), если slug не найден, перейти на 404, если используется /?p=111, проверить, используется ли постоянная ссылка, если да, перенаправить на структурированный URL и т. д.
При использовании template_redirect
это означает, что страница обрабатывается в template-loader.php
. Тогда процесс становится таким:
Вход -> Перенаправление -> Перенаправление шаблона (каноническое) -> Пользовательское перенаправление шаблона
Потому что он следует за do_action( 'template_redirect' ) в загрузчике шаблонов, который в этом случае будет загружаться несколько раз. Один из способов оптимизировать скрипт — использовать более высокий приоритет для пользовательского хука template_include
, чтобы проверка и перенаправление происходили раньше, аналогично Login Redirect
.
Поскольку достижение template_redirect
происходит довольно поздно в процессе загрузки, это не самое идеальное место для проверки входа пользователя и перенаправления куда-либо, не связанного с шаблонами.
Таким образом, если это не необходимо, например, для работы с перезаписью, пользовательской структурой URL или подготовкой пользовательских шаблонов, использование этого на более позднем этапе не рекомендуется. Кроме того, если перенаправление обрабатывается неумело, это может повлиять на SEO-рейтинг. Это основано на фактической последовательности загрузки, оптимизации SEO и личном опыте.

Я был очень доволен приведенной выше логикой и мне нужно было лишь немного изменить её. Добавление !
перед is_user_logged_in()
полностью решило мою проблему и позволило выполнить обратную логику.
/**********************************START*************************************
********** Перенаправление страницы аккаунта на страницу входа, если пользователь не авторизован *********
****************************************************************************/
add_action( 'template_redirect', function() {
if ( ! is_user_logged_in() || ! is_page() ) return;
$restricted = array( 4062, 4066 ); // все ваши защищённые страницы
if ( in_array( get_queried_object_id(), $restricted ) ) {
wp_redirect( site_url( '/account' ) );
exit();
}
});
