Перенаправление пользователя, если он авторизован

26 апр. 2020 г., 14:35:39
Просмотры: 2.83K
Голосов: 0

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

// Перенаправляем на страницу входа, если пользователь не авторизован
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
Комментарии

if ( ! is_user_logged_in() )

fuxia fuxia
26 апр. 2020 г. 15:15:28
Все ответы на вопрос 2
0

Метод 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 и личном опыте.

26 апр. 2020 г. 14:48:17
0

Я был очень доволен приведенной выше логикой и мне нужно было лишь немного изменить её. Добавление ! перед 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();
  }

});
27 апр. 2020 г. 01:44:35