it-swarm.cn

过滤器和动作挂钩之间的区别?

最近我一直在深入研究插件API,我想知道 动作和过滤器挂钩之间存在什么真正的差异 。它们都是接收数据作为参数的事件,它们似乎都能够做同样的事情。

显然,我发现当操作发生时会调用操作,并且在操作数据时调用过滤器,但它似乎只是一个语义命名差异。

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

49
Sruly

@Sruly

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

行动钩子

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

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

过滤钩

Filter Hooks的行为与Action Hooks非常相似,但它们的用途是接收值并可能返回值的修改版本。过滤器钩子也可以像Action Hook一样使用,即修改全局变量或生成一些HTML,假设这是调用钩子时需要做的事情。关于使用Action Hooks你不需要担心的Filter Hooks的一件非常重要的事情就是使用Filter Hook must返回(修改后的版本)第一个参数的人一个普通的新手错误就是忘记归还那个价值!

使用其他参数在过滤器挂钩中提供上下文

作为旁边我觉得Filter Hooks在早期版本的WordPress中蹒跚而行,因为它们只会收到一个参数;即他们会得到一个值来修改,但没有第二或第三个参数来提供任何上下文。最近,然而肯定的是,似乎WordPress核心团队(我)一直在为Filter Hooks添加额外的参数,以便您可以发现更多上下文。一个很好的例子是posts_where钩子;我相信它的几个版本只接受一个参数是当前查询的“where”类SQL,但现在它接受where子句对当前调用的WP_Query类实例的引用钩。

那真正的区别是什么?

实际上,Filter Hooks几乎是Action Hooks的超集。前者可以做后者可以做的任何事情而且更多一点,虽然开发人员没有责任使用他或她对Filter Hook做的Action Hook返回值。

给予指导和电报意图

但这可能不重要。我认为重要的是,开发人员选择使用Action Hook与Filter Hook,反之亦然,他们是通过电子邮件发送他们的意图并因此给予指导给可能是themer或插件的开发人员)使用钩子。实质上他们要么说“我要打电话给你,做你需要做的事情”“我要通过你要修改这个值,但要确保将它传回。“

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

希望这可以帮助!

56
MikeSchinkel

如果你查看add_action()核心函数的源代码,它只是add_filter()函数的包装器...

如果你看一下do_action()核心函数,它与apply_filters()核心函数非常相似,有一个非常关键的区别:它不会返回一个值。

那么这是什么意思?操作类似于过滤器,但操作不返回值,因此您无法修改数据。它表明,通过简单地复制过滤机制并且不返回值来创建WordPress的动作机制很简单。基本上,您只需执行一个操作即可执行函数而无需修改某些值。

11
trusktr

在简单的Word中。

Actions 是执行输出的PHP函数。

Filters 是那些返回输出的PHP函数。

更新: 我们可以扩展任何使用动作和过滤器的插件,而无需修改代码。通过在我们自己的主题或插件中添加过滤器和操作。


如何使用?

行动:

请查看主题functions.php文件中的以下简单示例。

  1. 示例一: (简单PHP示例)
功能测试(){
 echo“输出”; 
} 
 
测试(); 

以上程序打印输出:

输出

[注意:这里test()只需调用该函数。并执行回调函数'test'。]


  1. 示例二: (简单使用Action)
 function test1(){
 echo“输出”; 
} 
 add_action('test','test1'); 
 
 do_action('test'); 

以上程序打印输出:

输出

[注意:这里do_action('test')就像调用函数一样。并执行回调函数'test1'。]


  1. 示例三: (动作的另一种用法)
 function test2(){
 echo“Test 2”; 
} 
 add_action('test','test2',1); 
 
 function test1(){
 echo“Test 1”; 
} 
 add_action('test','test1',2); 
 
 do_action('test'); 

以上程序打印输出:

测试2测试1 

[注意:这里do_action('test')就像调用函数一样。并根据它的优先级执行回调函数。

回调函数'test1'具有优先级2并且'test2'具有优先级1.]

如果优先级改为'test1',优先级为1,'test2'优先级为2,则输出为:

测试1测试2 

  1. 示例四: (第三方支持) functions.php中添加以下代码
 function test1(){
 do_action('test_before'); 
 echo“Test 1”; 
 do_action('test_after'); 
 } 
 add_action('test','test1'); 
 
 do_action('test'); 

以上程序打印输出:

测试1 

现在,创建示例插件以检查第三方开发人员的工作方式。

  1. /wp-content/plugins/目录中创建文件夹'simple'。
  2. 创建名为'simple.php'的文件并添加以下代码。
/* 
 *插件名称:简单插件
 */
功能test_callback_function(){
 echo“来自插件”; 
} 
 add_action('test','test_callback_function'); 

现在,从WordPress管理仪表板激活我们的 简单插件

转到菜单插件并激活它。

激活插件上面的程序后打印输出:

测试1来自插件

[注意:如果我们将插件操作的优先级从1添加到9,那么它会打印输出,如:

来自pluginTest 1 

因为,WordPress会考虑所有添加的操作的10 priority by default。]

过滤器

检查以下示例:

简单PHP示例:

 $ data = array('one','two'); 
 print_r($ data); 

以上程序打印输出:

数组([0] =>一[1] =>二)
  1. 示例一: (简单使用过滤器)
 $ data = apply_filters('my_filter_name',array('one','two')); 
 print_r($ data); 
 
 add_filter(' my_filter_name',函数($ old_data){
返回数组('三','四'); 
}); 

以上程序打印输出:

数组([0] =>三[1] =>四)

在这里,我们添加了过滤器my_filter_name并使用array( 'one', 'two' )更改现有输出array( 'three', 'four' ),而不更改主题/插件文件。


4
maheshwaghmare