
文章目录
结论先行
用 WordPress 钩子时,action 做输出、filter 改值;优先级小数先跑;移除钩子必须在挂载后、执行前调用 remove_action;闭包匿名函数无法直接移除。验证用 error_log 打印执行顺序,失败即回退至优先级 10 默认逻辑。
action 与 filter 的区别
在 WordPress 6.5(2026 年主流版本)中,action 通过 do_action 触发,不返回值,用于执行副作用如排队脚本;filter 通过 apply_filters 触发,必须 return 修改后的值。混用会导致值丢失。官方文档见 Hooks API。
我们在 WordPress 主题开发入门教程:2026 服务商对比与决策指南 中强调:主题里用 wp_head action 输出 mete,用 the_content filter 加版权。如下最小示例:
<?php
add_action('init', function(){ error_log('action run'); });
add_filter('the_title', function($t){ return $t.'·'; });
?>优先级与执行顺序
add_action 第三参数为优先级,默认 10,越小越先执行。同优先级按挂载顺序。内部以 WP_Hook 类存储数组,do_action 时 ksort 后依次调用。验证:在俩函数写 error_log,看 debug.log 次序。
| 优先级 | 执行序 |
|---|---|
| 1 | 第一 |
| 10 | 默认 |
| 20 | 最后 |
获取报价
邮箱 + 需求 + 预算区间,24 小时内回复报价。
remove_action 的时机
必须在原 add_action 之后、do_action 之前移除。通常在 init 或 plugins_loaded 后执行。若原挂载在 priority 20,你用默认 10 移除会失败,须指定相同优先级。
排查流程
- 确认原钩子名、所在文件与优先级。
- 在自身插件用相同 priority 调用 remove_action。
- 在 do_action 前加 error_log 验证是否移除。
- 未生效则检查是否闭包或优先级错。
- 回退:注释移除代码,恢复默认行为。
- 用 Query Monitor 插件查钩子列表。
闭包无法移除的问题

匿名函数无函数名,remove_action 需 $function_to_remove 标识,故闭包不能移。解决:定义为命名函数或类方法。如下错误示例与正确写法:
<?php
// 错误:无法移除
add_action('save_post', function(){});
// 正确
function my_save(){}
add_action('save_post','my_save');
remove_action('save_post','my_save');
?>站点上线前应按 WordPress 网站上线前检查清单:2026 完整版 核对钩子冲突。另外,设计 CPT 时参考 自定义文章类型与分类法该怎么设计(附常见设计错误) 可避坑。
常见问题
remove_action 返回 false 怎么办?
说明函数名或优先级不匹配,打印 get_callbacks 检查,或改在 plugins_loaded 后执行。
filter 里忘记 return 会怎样?
变量变 null,内容丢失;用 error_log 输出入参比对返回。
怎么看所有已挂载钩子?
装 Query Monitor,或写 php 循环 global $wp_filter 打印。
动作清单
- 审计全站 add_action/filter,闭包改命名。
- 移除操作统一在 init 优先级 20 后做。
- 用 debug.log 验证顺序与移除。
- 上线前跑检查清单与钩子监控。
想让钩子不再踩坑?看我们的 外贸站技术托管,或读 技术栏目首页 更多实战。
