装了缓存插件后文章正文里的短代码原样输出,本地停掉该插件就正常,插件后台也没有相关开关。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,两个回调挂在同一个过滤器上默认优先级都是 10,注册顺序决定执行顺序,后注册的那个把前面已经处理好的内容整段替换掉了。

「WordPress 钩子优先级」这类改动最怕改一半,回滚脚本先准备好,再动生产。改完顺手把文档补一句,省得下次自己重新推一遍。

add_filter('the_content', 'my_filter', 9);
global $wp_filter;
var_dump($wp_filter['the_content']->callbacks);

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,用 wp_filter 打印 the_content 上各回调的优先级数字;把自己的处理提前到 9 或延后到 11 再执行一次;清掉对象缓存后刷新文章页逐段比对输出结果。

最后用这个标准收尾,正文里的短代码正常渲染,其他插件的处理结果也没有丢。

作者 9823189