wp cron event run membership_downgrade --due-now
wp option get timezone_string

会员到期日写的是 10 月 31 日,11 月 1 日上午还能用会员价,实测比规则晚了 8 小时才降级。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,定时任务按服务器时区的零点注册,服务器跑在 UTC,实际执行时间是北京时间早上八点。判定又用当前时间减 30 天,跨月时还会多算一天。

「等级降级时点」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:调度和判定都改用站点时区,别用服务器默认时区;判定按自然日比较到期日期,不按小时差算;跑之前先输出一份将被降级的名单,人工核一遍;改完在测试站把系统时间调到零点前后各跑一次。

改完只确认一件事:到期次日零点整完成降级,名单里没有提前或延后的账号。

作者 9823189