如何获取WordPress用户登录后访问的首个URL及相关钩子咨询
当然有啦!WordPress提供了多个在wp_login之后触发的钩子,而且其中不少比wp_login更适合你统计「登录后首个访问URL」的需求——毕竟wp_login是在用户验证通过但还没完成完整登录流程(比如创建会话、设置认证Cookie)时触发的,这时候你通过$_SERVER获取的REQUEST_URI大概率还是登录页面本身,并不是用户登录后要跳转的目标页面。
下面给你梳理几个实用的钩子,以及怎么适配你的场景:
1. login_redirect(最推荐)
这个钩子简直是为你的需求量身定做的!它在登录成功后、系统准备跳转到目标页面之前触发,你可以直接拿到用户即将访问的首个URL。
它的参数有三个:
$redirect_to:系统最终要跳转的URL$requested_redirect_to:用户原本请求跳转的URL(比如登录前访问的页面)$user:当前登录的用户对象
你可以在这里直接把目标URL存入数据库,示例代码如下:
add_filter('login_redirect', function($redirect_to, $requested_redirect_to, $user) { // 确保是有效登录用户 if ($user instanceof WP_User && !empty($redirect_to)) { // 将首个访问URL存入用户元数据(或你的自定义表) update_user_meta($user->ID, 'first_access_after_login', esc_url($redirect_to)); } // 必须返回跳转URL,否则会导致登录后无法跳转 return $redirect_to; }, 10, 3);
2. wp_login_success
这个钩子在用户完全完成登录流程(会话创建、Cookie设置完成)后立即触发,参数是用户ID和用户对象。不过要注意:它还是在登录页面的请求中触发的,所以直接获取REQUEST_URI得到的还是登录页URL。
如果想用这个钩子,你需要配合会话标记来后续记录:
add_action('wp_login_success', function($user_id, $user) { // 设置会话标记,标记用户刚完成登录 $_SESSION['just_logged_in'] = true; }, 10, 2); // 然后在前台/后台页面加载钩子中记录URL add_action('template_redirect', function() { if (isset($_SESSION['just_logged_in']) && is_user_logged_in()) { $current_url = home_url(add_query_arg(array(), $_SERVER['REQUEST_URI'])); // 存入数据库 update_user_meta(get_current_user_id(), 'first_access_after_login', esc_url($current_url)); // 清除标记,避免重复记录 unset($_SESSION['just_logged_in']); } });
3. auth_cookie_valid
这个钩子在用户的认证Cookie验证通过时触发,每次用户加载页面且登录状态有效时都会触发。如果你需要区分「首次登录后的访问」,可以结合会话标记来使用,逻辑和上面wp_login_success的示例类似。
额外提醒
你之前用wp_login获取URL的方式可能存在问题:因为wp_login触发时,用户还在登录请求的上下文里,此时的REQUEST_URI是登录页面的路径,并不是登录后要访问的页面。所以建议换成上面推荐的login_redirect钩子,能直接拿到准确的目标URL。
内容的提问来源于stack exchange,提问作者vuffer

