自定义设置页点保存,页面直接返回“419 页面已过期”,表单里 nonce 字段确实存在,值也不为空。日志里能对上时间点,这种反而好排。

生成 nonce 时用的 action 是 settings_save,校验时 check_admin_referer 传的却是 save_settings,两边对不上。页面被整页缓存时拿到旧 nonce 也会这样。这一点先确认清楚,后面就不用反复试。

wp_nonce_field('settings_save', 'book_nonce');
// 处理端
check_admin_referer('settings_save', 'book_nonce');

这次卡住的地方就在「admin_post 419」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

处理上按这个顺序:把生成与校验的 action 改成同一个字符串;确认设置页没有被整页缓存;用 wp_verify_nonce 打印校验结果 定位是哪一步失败。

结果对不对很好判断,保存后返回 302 并出现成功提示,重复提交也不再报 419。

作者 9823189