Answers:
嗨@Sruly:
您已经回答了您自己的问题,但是我会详细说明。
当WordPress核心或某些插件或主题使您有机会在特定点插入代码并执行以下一项或多项操作时,可以使用操作挂钩。
echo
以注入一些HTML或其他内容到响应缓冲区,do_action_ref_array()
而不是调用,do_action()
因为钩子不支持按引用传递变量。)过滤器挂钩的行为与操作挂钩非常相似,但它们的预期用途是接收值并可能返回该值的修改版本。过滤器挂钩也可以像动作挂钩一样使用,即修改全局变量或生成一些HTML,前提是调用挂钩时需要执行此操作。关于过滤器挂钩非常重要的一件事,您无需担心操作挂钩,这是使用过滤器挂钩的人必须返回它传递的第一个参数(的修改版本)。新手常见的错误是忘记返回该值!
顺便说一句,我觉得过滤钩子是在早期版本的WordPress的步履蹒跚,因为他们将接受只有一个参数; 也就是说,他们将获得一个要修改的值,但没有第二个或第三个参数可以提供任何上下文。但是,最近,积极的是,似乎WordPress核心团队(对我来说)很高兴地向Filter Hooks添加了额外的参数,以便您可以发现更多上下文。posts_where
钩子就是一个很好的例子。我相信有几个版本支持它仅接受一个参数作为当前查询的“ where”类SQL,但是现在它接受where子句和对WP_Query
调用该钩子的类的当前实例的引用。
实际上,筛选器挂钩几乎是动作挂钩的超集。前者可以执行后者所能做的任何事情,并且更多一点,尽管开发人员没有责任使用Action Hook返回值,而后者是他或她使用Filter Hook所做的。
但这可能并不重要。我认为重要的是,通过选择使用Action Hook和Filter Hook的开发人员,反之亦然,他们在传达自己的意图,从而为可能正在使用该Hook的主题或插件开发人员提供指导。本质上,他们说的是“我要打电话给您,做您需要做的一切” 或 “我要将该值传递给您以进行修改,但请确保将其传递回来。”
因此,最终我认为,选择钩子类型所提供的指导是区别背后的真正价值。IMO,无论如何。
希望这可以帮助!
简单来说。
动作 是那些执行输出的PHP函数。
过滤器 是那些返回输出的PHP函数。
更新:我们可以扩展使用操作和过滤器的任何插件,而无需修改其中的代码。通过在我们自己的主题或插件中添加过滤器和操作。
查看主题functions.php
文件中的以下简单示例。
功能测试() { 回显“输出”; } 测试();
上面的程序打印输出:
输出量
[注意:这里的test()只是调用函数。并执行回调函数“ test”。]
函数test1(){ 回显“输出”; } add_action('test','test1'); do_action('test');
上面的程序打印输出:
输出量
[注意:这里的do_action('test')
工作类似于调用函数。并执行回调函数“ test1”。]
函数test2(){ 回显“测试2”; } add_action('test','test2',1); 函数test1(){ 回显“测试1”; } add_action('test','test1',2); do_action('test');
上面的程序打印输出:
测试2测试1
[注意:这里的do_action('test')
工作类似于调用函数。并按优先级执行回调函数。
回调函数'test1'具有优先级2,而'test2'具有优先级1。]
如果更改优先级,例如优先级为1的“ test1”和优先级为2的“ test2”,则输出将为:
测试1测试2
functions.php
函数test1(){ do_action('test_before'); 回显“测试1”; do_action('test_after'); } add_action('test','test1'); do_action('test');
上面的程序打印输出:
测试1
现在,创建示例插件以检查其对第三方开发人员的工作方式。
/wp-content/plugins/
目录中创建文件夹“ simple” 。/ * *插件名称:简单插件 * / 函数test_callback_function(){ 回显“来自插件”; } add_action('test','test_callback_function');
现在,从WordPress管理控制台激活我们的Simple插件。
转到菜单插件并激活它。
在激活上面程序的插件后,输出输出:
测试1来自插件
[注意:如果我们将插件操作的优先级从1增至9,则其输出结果如下:
从pluginTest 1
因为,WordPress考虑了10 priority by default
所有已添加的操作。]
检查以下示例:
简单的PHP示例:
$ data = array('一个','两个'); print_r($ data);
上面的程序打印输出:
数组([0] => 1 [1] => 2)
$ data = apply_filters('my_filter_name',array('one','two')); print_r($ data); add_filter('my_filter_name',function($ old_data){ return array('three','four'); });
上面的程序打印输出:
数组([0] =>三个[1] =>四个)
在这里,我们添加了过滤器my_filter_name
并更改了现有的输出array( 'one', 'two' )
,array( 'three', 'four' )
而没有更改主题/插件文件。