客户下单后收到两封确认邮件,内容几乎一样但模板不同。两个插件单独启用都只发一封,一起开着就变两封,日志里同一秒有两条发信记录。乍看像缓存或者权限的锅,追下去往往不是。
do_action("abc_sync_after_order", $order_id);
add_action("abc_sync_after_order", "abc_send_mail", 10, 1);
// 不要用 send_email、after_order 这类通用名
追下去是这么回事:两个插件用了同一个不带前缀的钩子名,各自的回调都挂在这条钩子上。触发时按优先级依次执行,谁也不知道还有别人在监听同一个名字。
「插件钩子命名冲突」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,把插件自己的钩子名改成带前缀的完整名字 逐处替换;对外暴露的扩展点另外起名 不要复用通用词;改完搜一遍这个字符串 确认没有残留的旧写法。
验收就看一点,两个插件同时启用后下单只收到一封确认邮件,日志里的发信记录只剩一条。
