过滤器和动作钩之间的区别?
-
16-10-2019 - |
题
我最近一直在深入研究插件API,我想知道 动作和过滤钩之间有什么真正的差异. 。他们俩都是接收数据作为参数的事件,他们似乎都可以做同样的事情。
显然,我看到在动作发生时调用了动作,并且在操纵数据时调用过滤器,但这似乎只是语义命名差异。
除了语义及其用途之外,它们之间还有什么真正的差异?
解决方案
你好 @sruly:
您几乎回答了自己的问题,但我会详细说明。
动作钩
动作钩 当WordPress Core或某些插件或主题使您有机会在特定点插入代码并执行以下一项或多项时,可用于使用:
- 利用
echo
至 注入一些HTML 或响应缓冲区中的其他内容, - 修改全局变量状态 对于一个或多个变量,和/或
- 修改参数 传递给您的钩功能(假设挂钩是由
do_action_ref_array()
代替do_action()
由于后者不支持通过变量 引用.)
过滤钩
过滤钩 表现与 动作钩 但是他们的预期用途是接收值并有可能返回该值的修改版本。也可以像动作钩IE一样使用过滤器钩子来修改全局变量或生成一些HTML,假设这是挂钩时需要做的事情。关于滤镜,您不必担心动作挂钩的一件事是非常重要的一件事是使用过滤器钩的人 必须 返回(修改版本的)第一个参数已通过。一个常见的新手错误是忘记返回该价值!
使用其他参数在过滤器钩中提供上下文
作为旁白 我觉得过滤器挂钩是在较早版本的WordPress中浏览的,因为它们只会收到一个参数。即,他们将获得一个值进行修改的值,但没有第二个或第三个参数来提供任何上下文。但是,最近,很积极地,WordPress Core团队(对我来说)似乎很高兴地添加了额外的参数来过滤钩子,以便您可以发现更多的上下文。一个很好的例子是 posts_where
钩;我相信有几个版本只接受了一个参数是当前查询的 “在哪里” SQL类,但现在它接受了Where子句 和 对当前实例的引用 WP_Query
正在调用钩子的课程。
那么真正的区别是什么?
实际上,滤镜钩几乎是动作钩的超集。前者可以做后者可以做的任何事情,尽管开发人员没有责任用他或她使用过滤器钩所做的动作挂钩返回价值。
提供指导和电报意图
但这可能并不重要。我认为重要的是,开发人员选择使用动作钩与滤镜钩,反之亦然它们是 电报他们的意图 因此 提供指导 可能使用挂钩的主题或插件开发人员。从本质上讲,他们要么说 “我要打电话给你,做你需要做的一切” 或者 “我将通过这个值来修改这个值,但请确保您将其传递回去."
最终 我认为选择挂钩类型提供的指导是区别背后的真正价值. 。 IMO,无论如何。
希望这可以帮助!
其他提示
如果您查看源 add_action()
核心功能,这只是一个包装器 add_filter()
功能...
如果你看 do_action()
核心功能,与 apply_filters()
核心功能,具有一个非常关键的差异:它不会返回值。
那么这是什么意思?操作就像过滤器一样,除了操作不会返回值,因此您无法修改数据。它表明,通过简单地复制过滤器机制而不返回值来创建WordPress的动作机制很简单。基本上,您只能通过操作执行一个函数而无需修改某些值即可。
用简单的单词。
动作 是执行输出的那些PHP功能。
过滤器 是返回输出的那些PHP功能。
更新: 我们可以扩展任何使用操作和过滤器的插件,而无需修改那里的代码。通过在我们自己的主题或插件中添加过滤器和操作。
如何使用?
行动:
在您主题中查看以下简单示例 functions.php
文件。
- 示例一: (简单的PHP示例)
function test() { echo "Output"; } test();
上面的程序打印输出:
Output
注意:此处test()只需调用该函数即可。并执行回调函数“测试”。
- 示例两个: (简单使用动作)
function test1() { echo "Output"; } add_action( 'test', 'test1' ); do_action( 'test' );
上面的程序打印输出:
Output
注意:这里 do_action('test')
像通话功能一样工作。并执行回调函数'test1'。
- 示例三: (动作的另一种用途)
function test2() { echo "Test 2"; } add_action( 'test', 'test2', 1 ); function test1() { echo "Test 1"; } add_action( 'test', 'test1', 2 ); do_action( 'test' );
上面的程序打印输出:
Test 2Test 1
注意:这里 do_action('test')
像通话功能一样工作。并在其优先级上执行回调功能。
回调函数'test1'具有优先级2,而“ test2”具有优先级。
如果优先级是更改的,例如优先级1和优先级2的“ test1”和“ test2”,则输出将为:
Test 1Test 2
- 示例四: (第三方支持)在以下代码中添加以下代码
functions.php
function test1() { do_action( 'test_before' ); echo "Test 1"; do_action( 'test_after' ); } add_action( 'test', 'test1' ); do_action( 'test' );
上面的程序打印输出:
Test 1
现在,创建示例插件以检查第三方开发人员的工作原理。
- 创建文件夹“简单”
/wp-content/plugins/
目录。 - 创建名为“ Simple.php”的文件,并添加下面的代码。
/* * Plugin Name: Simple Plugin */ function test_callback_function() { echo "From plugin"; } add_action( 'test', 'test_callback_function' );
现在,激活我们的 简单的插件 从WordPress管理仪表板。
获取菜单插件并激活它。
激活插件之后,上面的程序打印输出:
Test 1From plugin
注意:如果我们将插件操作的优先级从1到9添加,则将输出打印出:
From pluginTest 1
因为,WordPress考虑 10 priority by default
对于所有附加动作。
过滤器
检查以下示例:
简单的PHP示例:
$data = array( 'one', 'two' ); print_r( $data );
上面的程序打印输出:
Array ( [0] => one [1] => two )
- 示例一: (简单使用过滤器)
$data = apply_filters( 'my_filter_name', array( 'one', 'two' ) ); print_r( $data ); add_filter( 'my_filter_name', function( $old_data ) { return array( 'three', 'four' ); });
上面的程序打印输出:
Array ( [0] => three [1] => four )
在这里,我们添加了过滤器 my_filter_name
并更改现有输出 array( 'one', 'two' )
和 array( 'three', 'four' )
不更改主题/插件文件。