使用wp_sign_on()与set_current_user()无法实现用户持久登录的问题
解决WordPress自定义登录中wp_signon()后无法保持登录的问题
兄弟,你这个问题我之前也踩过坑!核心原因就是只调用set_current_user()完全不够,漏掉了设置登录Cookie的关键步骤。WordPress是靠Cookie来跨页面维持登录状态的,光拿到用户对象但没把登录信息写入Cookie,刷新页面自然就回到未登录状态了。
给你整理一套实打实能解决问题的流程,照着来绝对没问题:
- 先确保wp_signon()的调用参数准确,尤其是要根据站点HTTPS状态设置安全Cookie:
// 从POST获取用户输入,记得做安全过滤 $credentials = array( 'user_login' => sanitize_text_field($_POST['username']), 'user_password' => $_POST['password'], 'remember' => isset($_POST['rememberme']) ? true : false ); // 第三个参数is_ssl()很关键,HTTPS站点必须设为true,否则Cookie大概率不生效 $user = wp_signon($credentials, is_ssl());
- 接着检查登录是否成功,处理错误情况:
if (is_wp_error($user)) { // 登录失败时输出错误提示 echo '登录出错:' . $user->get_error_message(); return; }
- 最最关键的一步!调用
wp_set_auth_cookie()写入登录Cookie,这才是跨页面维持登录的核心:
// 参数依次是用户ID、是否记住登录、安全Cookie开关 wp_set_auth_cookie($user->ID, $credentials['remember'], is_ssl()); // 再设置当前用户,这一步是让当前请求内的函数能获取到登录用户 set_current_user($user->ID); // 可选但推荐:触发wp_login钩子,保证评论、用户日志等关联功能正常触发 do_action('wp_login', $user->user_login, $user);
- 最后跳转页面(别直接刷新,跳转能确保Cookie完全生效):
wp_redirect(admin_url()); // 跳转到后台,或者你自定义的登录后页面 exit; // 一定要加exit,避免后续代码干扰Cookie设置
另外给你提几个容易踩的隐形坑:
- 禁止提前输出内容:在调用wp_set_auth_cookie()之前,绝对不能有任何echo、print或者HTML输出(包括代码里的空格、换行),否则HTTP头已经发送,Cookie根本设置不了。
- 钩子时机要选对:自定义登录的代码最好挂在
template_redirect或者init钩子之后执行,别在太早期的钩子(比如plugins_loaded之前)调用,否则WordPress的Cookie机制还没初始化完成。 - 站点域名要一致:检查WP后台「设置-常规」里,WordPress地址和站点地址是否完全一致(包括HTTP/HTTPS前缀),域名不一致会导致Cookie跨域失效。
内容的提问来源于stack exchange,提问作者E.Abbott
相关产品推荐
相关产品推荐

