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

Вопрос или проблема

Нижеследующий скрипт отлично работает и перенаправляет пользователей, которые вышли из системы, на страницу входа, если они пытаются получить доступ к странице моего аккаунта.

// Перенаправление страницы аккаунта на страницу входа, если пользователь вышел из системы
add_action( 'template_redirect', function() {

      if ( is_user_logged_in() || ! is_page() ) return;

      $logged_in_restricted = array( 5156, 000 ); // все ваши ограниченные страницы, если пользователь вышел из системы

      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_out() || ! is_page() ) return;

      $logged_in_restricted = array( 3156, 4532 ); // все ваши ограниченные страницы, если пользователь вошел в систему

      if ( in_array( get_queried_object_id(), $logged_in_restricted ) ) {
        wp_redirect( site_url( '/my-account' ) );  // страница, на которую пользователь перенаправляется, если ограничение выполнено
        exit();
      }

});

Я понимаю, что is_user_logged_out не существует. Что я могу использовать, чтобы выполнить это?

Я был очень доволен вышеописанной логикой и мне просто нужно было немного изменить ее. Добавление ! перед is_user_logged_in() полностью решило мою проблему и позволило мне сделать логику в обратном направлении.

/**********************************НАЧАЛО*************************************
********** Перенаправление страницы аккаунта на страницу входа, если пользователь вошел в систему *********
****************************************************************************/

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();
  }

});

Метод 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, этот метод проще, чем метод 1.

  <input type="hidden" name="redirect_to" value="somewhere_url" />

Для вашего оригинального метода выхода из системы вы также можете использовать фильтр logout_redirect для добавления URL-адреса перенаправления при выходе вместо действия template_redirect. template_redirect очень универсален, но больше применений включает перенаправление на конкретную страницу (управление шаблонами). Просто дополнительные заметки для справки.

Сравнение последовательности между template_redirect и login_redirect

Согласно последовательности загрузки. По умолчанию, после входа WordPress перенаправляет пользователя на конкретную страницу, чтобы заработал cookie, о чем я ответил здесь ранее.

Login -> Redirect -> Template Redirect(canonical), который обычно выполняется с помощью redirect_canonical(), если slug не найден, переходим на 404, если используется /?p=111, проверяем, используется ли структура постоянной ссылки, если да, перенаціляем на URL с постоянной структурой и так далее.

Если использовать template_redirect, это означает, что страница обрабатывается в template-loader.php. Это становится

Login -> Redirect -> Template Redirect(canonical) -> Custom Template Redirect

Поскольку оно следует do_action( ‘template_redirect’ ) в лоадере шаблонов, которое будет загружаться несколько раз в этом случае. Один из способов оптимизировать скрипт – использование более высокого приоритета для пользовательского хука template_include, чтобы проверять и перенаправлять раньше, выполняя функцию, аналогичную Login Redirect.

Так как достижение template_redirect занимает некоторое время загрузки. Поэтому это все еще не идеальное место для проверки входа пользователя и перенаправления куда-либо, что не связано с вопросами шаблонов.

Таким образом, если нет необходимости, такие как выполнение переписывания, пользовательская структура URL или подготовка пользовательского шаблона, использование его на более позднее время не рекомендуется. Также, если перенаправление обрабатывается неумело, это может также повлиять на рейтинг SEO. Это основано на фактической последовательности загрузки, точке зрения SEO-оптимизации и личном опыте.

Ответ или решение

Теория:

В задачах с перенаправлением пользователей на основе их авторизации важно учитывать взаимодействие пользователя с различными страницами. В WordPress стандартные функции, такие как is_user_logged_in() и template_redirect, предоставляют разработчикам возможности управлять поведением перенаправления. Основная задача — обеспечить доступ только к определенным страницам в зависимости от статуса пользователя (авторизован он или нет), что может повысить удобство использования и безопасность сайта.

Пример:

Предположим, что у вас есть сайт, где аутентифицированные пользователи должны автоматически перенаправляться на страницу "my-account" при попытке посетить страницы "login" или "register". В приведенном примере кода используется WordPress-хук template_redirect для этой цели:

add_action( 'template_redirect', function() {

  if ( !is_user_logged_in() || !is_page() ) return;

  $logged_in_restricted = array( 4062, 4066 ); // ID страниц, доступных только неавторизованным пользователям

  if ( in_array( get_queried_object_id(), $logged_in_restricted ) ) {
    wp_redirect( site_url( '/my-account' ) ); 
    exit();
  }

});

Данный код проверяет, авторизован ли пользователь, и если он пытается получить доступ к страницам, указанным в массиве $logged_in_restricted, перенаправляет его на страницу "my-account".

Применение:

Этот подход может быть полезен на сайтах, где есть четкое разделение между страницами для аутентифицированных и неаутентифицированных пользователей. Использование !is_user_logged_in() позволяет управлять доступом, обеспечивая, что авторизованные пользователи имеют доступ к ресурсам, которые им предназначены, без возможности вернуться на страницы входа и регистрации.

Этот метод прост в реализации и эффективен для небольших сайтов или сайтов со средней сложностью. Однако для более сложных решений, например, с более сложной бизнес-логикой, стоит рассмотреть дополнительные фильтры, такие как login_redirect, которые позволяют более гибко обрабатывать перенаправления после входа в систему.

Заключение:

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

Оцените материал
Добавить комментарий

Капча загружается...