点击确认邮件里的链接后页面显示订阅成功,后台列表里这条记录三天后仍是 pending,再点一次链接提示 token 已使用,客服只能手工改状态。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,确认接口先返回 302 跳转,再把状态写回数据库,跳转和写库之间没有事务包住,写库那步报错就被吞掉了。日志里只有一条重定向记录,看不到更新语句。
「订阅确认状态未落库」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
UPDATE wp_subscribers SET status = 'confirmed', confirmed_at = NOW() WHERE token = %s AND status = 'pending';
具体做法是,把状态更新放到跳转之前,更新影响行数为零就直接返回错误页,别继续跳;用同一个 token 连点两次,确认第二次进的是已确认分支而不是抛异常;给 pending 记录加一个定时巡检,超过十分钟还停在原状态就告警。
最后用这个标准收尾,点开确认链接后列表状态立刻变成 confirmed,同一个 token 第二次点开提示已确认。
