Вопрос или проблема
Я реализую простую функцию входа по магической ссылке, и она работает хорошо, однако, когда пользователь перенаправляется на главную страницу после входа, функция is_user_logged_in() все еще возвращает false, хотя куки для входа устанавливаются (это подтверждено через инструменты разработки). Если я затем обновляю страницу или перехожу на другую страницу, то is_user_logged_in() возвращает true.
Ниже мой код, я убрал всю логику валидации аутентификации ради простоты:
// добавляем правило перезаписи для ссылки на вход
add_action('init', function () {
add_rewrite_rule('login-link$', 'index.php?login_link=1', 'top');
});
// добавляем переменную запроса для ссылки на вход
add_filter('query_vars', function ($query_vars) {
$query_vars[] = 'login_link';
return $query_vars;
});
// обрабатываем ссылку на вход
add_action('parse_request', function (&$wp) {
if (array_key_exists('login_link', $wp->query_vars)) {
$user = // получить пользователя и проверить хэшированный токен из url...
// вход пользователя
wp_clear_auth_cookie();
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID);
do_action('wp_login', $user->user_login, $user);
// перенаправление на главную
wp_safe_redirect(home_url());
exit();
}
});
Вызов is_user_logged_in() происходит в файле шаблона footer.php:
<?php if (is_user_logged_in()) : ?>
<p>Вошел как <?php echo esc_html(wp_get_current_user()->user_email); ?></p>
<?php endif; ?>
Насколько я понимаю, хук parse_request срабатывает до отправки заголовков, и куки сохраняются в браузере, поэтому я не думаю, что это проблема. Есть идеи, почему это может происходить?
Ответ или решение
Вопрос о том, почему функция is_user_logged_in()
возвращает false
после пользовательского входа и перенаправления, может быть довольно запутанным. Давайте подробно разберем ситуацию и выявим возможные причины этой проблемы, а также предложим практические решения.
Контекст Проблемы
Вы реализуете функцию входа с помощью "волшебной ссылки"; после успешной аутентификации пользователя с использованием этой ссылки, происходит перенаправление на главную страницу. Однако в момент перенаправления функция is_user_logged_in()
продолжает возвращать false
, что противоречит ожидаемому поведению — пользователь уже должен быть аутентифицирован.
Возможные Причины
-
Асинхронность Регистрации Кук:
- Принимая во внимание вашу реализацию, логика аутентификации выполняется корректно, однако, в процессе очистки и установки аутентификационных кук может произойти задержка. Возможно, кука не успевает обновиться до выполнения перенаправления.
-
Проблемы с Кешированием:
- Если используется кеширование страниц (например, через плагины), это может привести к тому, что старые данные сохраняются в кэше и отображаются пользователю. Как результат, функция
is_user_logged_in()
может не получать актуальные данные.
- Если используется кеширование страниц (например, через плагины), это может привести к тому, что старые данные сохраняются в кэше и отображаются пользователю. Как результат, функция
-
Неверное Использование Хуков:
- Хотя вы упоминаете про исполнение хука
parse_request
перед тем, как заголовки будут отправлены, в некоторых случаях это может вызвать проблемы с правильной последовательностью выполнения. Возможно, стоит рассмотреть варианты использования других хуков, таких какtemplate_redirect
, для проверки состояния пользователя перед выводом шаблона.
- Хотя вы упоминаете про исполнение хука
Рекомендуемые Решения
-
Добавление Задержки Перед Перенаправлением:
Попробуйте добавить небольшую паузу перед перенаправлением, что может обеспечить, что куки успеют обновиться:// ... wp_safe_redirect(home_url()); ob_end_flush(); exit();
-
Очистка Кеша:
Убедитесь, что кеш на уровне сервера или плагинов (например, W3 Total Cache, WP Super Cache) очищается после каждого входа пользователя. Вы можете использовать соответствующие функции очистки кеша в момент аутентификации. -
Использование Хука
wp_login
:
Ваша аутентификационная логика уже вызываетdo_action('wp_login')
, но убедитесь, что перед перенаправлением выполняется обработка любых дополнительных действий, связанных сwp_login
. Это поможет в обработке всех операций, связанных с аутентификацией пользователя и кук:do_action('wp_login', $user->user_login, $user); wp_safe_redirect(home_url()); exit();
-
Проверка Настроек Cookie:
Убедитесь, что настройки по работе с куками в вашем WordPress корректны, особенно в отношении домена и пути. Функцияset_auth_cookie
должна устанавливать куки корректно, и любые конфликты могут вызвать проблемы.
Заключение
Предложенные решения должны помочь вам разобраться с проблемой функции is_user_logged_in()
, возвращающей false
сразу после перенаправления. Проверьте порядок выполнения хуков и настройки кеширования, а также принимайте во внимание асинхронность работы с куками. Если прохождение вышеуказанных шагов не решит проблему, рассматривайте возможность использования инструментария для отладки WordPress для более глубокого анализа работы системы аутентификации.