表单提交后后台生成了两条一模一样的记录,日志里同一个回调打印两次,代码里却只写了一次 add_action。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

if (!has_action('save_post', 'my_save')) {
  add_action('save_post', 'my_save');
}
var_dump(has_action('save_post', 'my_save'));

模板文件被 include 两次,或者插件与主题各注册了一次同名回调,钩子数组里就存下两条指向同一函数的记录。这一点先确认清楚,后面就不用反复试。

碰到「WordPress 钩子重复执行」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

具体做法是,先用 has_action 检查这个回调是不是已经注册过;把注册包进 function_exists 判断里再执行;重新提交一次表单核对后台生成的记录条数。

改完照着核一遍,提交一次只生成一条记录,日志里该回调也只出现一次。

作者 9823189