You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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设置

另外给你提几个容易踩的隐形坑:

  1. 禁止提前输出内容:在调用wp_set_auth_cookie()之前,绝对不能有任何echo、print或者HTML输出(包括代码里的空格、换行),否则HTTP头已经发送,Cookie根本设置不了。
  2. 钩子时机要选对:自定义登录的代码最好挂在template_redirect或者init钩子之后执行,别在太早期的钩子(比如plugins_loaded之前)调用,否则WordPress的Cookie机制还没初始化完成。
  3. 站点域名要一致:检查WP后台「设置-常规」里,WordPress地址和站点地址是否完全一致(包括HTTP/HTTPS前缀),域名不一致会导致Cookie跨域失效。

内容的提问来源于stack exchange,提问作者E.Abbott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:15:48