问题描述

最近我一直在看插件 API,我想知道动作和过滤器钩子之间有什么真正的区别。他们都是接收数据作为参数的事件,它们似乎都能够做同样的事情。

显然,我看到,当操作发生时调用动作,数据被操作时调用过滤器,但它似乎只是一个语义命名的区别。

除了语义和它们所用的是什么,他们之间有什么真正的区别?

最佳解决方案

嗨 @Sruly:

你几乎回答了你自己的问题,但我会详细说明一下。

行动钩

操作钩子适用于 WordPress 核心或某些插件或主题使您有机会在某一点插入代码并执行以下一项或多项操作:

  1. 使用 echo 将一些 HTML 或其他内容注入响应缓冲区,
  2. 修改一个或多个变量的全局变量状态,和/或
  3. 修改传递给你的钩子函数的参数 (假设钩子被 do_action_ref_array()而不是 do_action()调用,因为后者不支持传递变量 by-reference))

过滤钩

过滤器钩子的行为与 Action Hook 非常相似,但它们的预期用途是接收值并可能返回值的修改版本。也可以像 Action Hook 一样使用过滤器钩子,即修改全局变量或生成一些 HTML,假设这是调用钩子时需要执行的操作。有一件事情,对于 Hooks 而言,Filter Hooks 并不需要担心,使用 Filter Hook 的人必须返回 (修改版本) 第一个参数。一个常见的新手错误是忘记回报这个价值!

使用附加参数来提供过滤钩中的上下文

除此之外,我觉得 Filter Hooks 在早期版本的 WordPress 中被淘汰,因为它们只能接收一个参数; 即它们将获得修改的值,但没有提供任何上下文的第二或第三参数。最近,积极的是,似乎 WordPress 的核心团队 (对我来说) 乐意为 Filter Hook 添加额外的参数,以便您可以发现更多的上下文。一个很好的例子是 posts_where 钩子; 我相信几个版本,它只接受一个参数是当前查询的”where” 类 SQL,但是现在它接受 where 子句和对调用钩子的 WP_Query 类的当前实例的引用。

那么真正的区别是什么呢?

实际上,过滤钩几乎是动作钩的超集。前者可以做任何事情,后者可以做,有点更多,尽管开发商没有责任返回一个价值与他或她做的过滤钩的动作钩。

指导和电报意图

但这可能不是什么重要的。我认为重要的是,由开发人员选择使用 “动作钩” 和 “过滤钩”,反之亦然,他们会传送他们的意图,从而指导可能正在使用钩子的开发人员或插件开发人员。实质上,他们说 “我要调用你,做任何你需要做的事情”,或者 “我会把你的价值传给你来修改,但确保你把它传回去。”

所以最终我认为选择钩型提供的指导是区分背后的真正价值。 IMO,无论如何。

希望这可以帮助!

次佳解决方案

如果您查看 add_action()内核函数的源代码,它只是 add_filter()函数的包装器…

而且如果你看 do_action()的核心功能,它与 apply_filters()核心功能非常相似,有一个很大的区别:它不返回一个值。

那么这是什么意思?操作就像过滤器,除了操作不返回值,因此您不能修改数据。它表明通过简单地复制过滤器机制而不返回值来创建 WordPress 的动作机制很简单。基本上,您只需执行一个功能即可修改某些值。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。