用户注销后想用同一个邮箱重新注册,提示邮箱已被占用,可登录又提示账号不存在,找回密码也收不到信。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

$wpdb->update($wpdb->users,
  array('user_email' => 'deleted_' . $uid . '@invalid.local', 'user_status' => 1),
  array('ID' => $uid)
);

注销做的是软删除,用户行还在,邮箱字段原样保留,唯一索引照样生效。登录查询过滤了已删除状态,注册查重却没有过滤,两条路径口径不一致。这一点先确认清楚,后面就不用反复试。

「注销邮箱占用」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,注销时把邮箱改写成带后缀的占位值,释放原邮箱;或者给唯一索引加上删除状态,只对有效行生效;注册查重和登录查询用同一个条件,别各写一套;注销后立刻用原邮箱注册一次,确认能走通整个流程。

改完照着核一遍,注销后原邮箱能注册成功,旧的订单记录仍能按原邮箱查到。

作者 9823189