$until = get_transient('lock_' . $user_id);
if ($until && $until > time()) {
  wp_die('请在 ' . human_time_diff(time(), $until) . ' 后重试');
}

提示写的是请 15 分钟后再试,用户等了半小时还是被拦,换浏览器也一样。运维清了一次缓存才恢复正常。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,失败次数存在缓存里,过期时间只在第一次失败时设置,后面每失败一次就把计数加一但没重置 TTL,锁定时又按固定文案写死十五分钟。锁定到期后计数没清零,下一次失败直接又触发。

「登录锁定计数」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

处理上按这个顺序:计数和锁定时间分开存,锁定时写入明确的解锁时间戳;登录成功后立刻清零计数,别等自然过期;提示里带上真实的解锁时间,别写死分钟数;连续失败到触发锁定,等解锁后再试一次,确认能进。

改完只确认一件事:锁定提示里的剩余时间准确,到点后能正常登录,计数也已清零。

作者 9823189