add_action('wp_footer', function(){
  if (!is_singular()) return;
  echo '<script>window.addEventListener("beforeunload",function(){localStorage.setItem("draft",document.querySelector("#comment").value)});</script>';
});

把文章页在标签页里放了两天,回来写完评论点提交,直接跳到一片空白的 403 页,没有提示,退回去再提交还是 403。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,评论表单的 nonce 默认二十四小时失效,页面被整页缓存后拿到的还是旧的。校验失败时核心只返回 403,不会在表单上显示原因。缓存插件如果连 nonce 一起缓存,所有访客拿到的是同一个值。

「评论 nonce 过期」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:把评论页从整页缓存里排除,至少让 nonce 每次都重新生成;给 403 加一个可读提示,告诉用户刷新页面再提交,别把内容丢掉;表单内容存一份到本地存储,提交失败后还能恢复。

改完只确认一件事:页面放置两天后提交仍能成功,命中 403 时也有明确提示可以刷新。

作者 9823189