过滤器和操作挂钩之间的区别是什么?

时间:2010-08-29 作者:Sruly

我最近更深入地研究了插件API,我想知道what real differences there were between action and filter hooks. 它们都是接收数据作为参数的事件,似乎都能做同样的事情。

显然,我看到在操作发生时调用操作,在操作数据时调用过滤器,但这似乎只是语义命名的不同。

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

4 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@Sruly:

你基本上已经回答了你自己的问题,但我会详细说明一下。

当WordPress core或某个插件或主题为您提供在某个点插入代码并执行以下一项或多项操作的机会时,可以使用操作挂钩:

使用echoinject some HTML 或其他内容放入响应缓冲区Modify global variable state 对于一个或多个变量,和/或Modify the parameters 传递给钩子函数(假设钩子由do_action_ref_array() 而不是do_action() 因为后者不支持通过引用传递变量

    过滤器挂钩的行为与动作挂钩非常相似,但它们的预期用途是接收值并可能返回值的修改版本。过滤器挂钩也可以像操作挂钩一样使用,即修改全局变量或生成一些HTML,假设调用挂钩时需要这样做。关于过滤器挂钩,一件非常重要的事情是,使用过滤器挂钩的人must 返回传递的第一个参数(修改后的版本)。一个常见的新手错误是忘记返回该值!

    使用其他参数在过滤器挂钩中提供上下文,作为旁白,我觉得在WordPress的早期版本中,过滤器挂钩受到了限制,因为它们只接收一个参数;i、 e他们将得到一个要修改的值,但没有第二个或第三个参数来提供任何上下文。然而,最近,WordPress核心团队似乎(对我来说)一直在愉快地为过滤器挂钩添加额外的参数,以便您可以发现更多的上下文。一个很好的例子是posts_where 钩我相信有几个版本以前它只接受一个参数,即当前查询的“where”类SQL,但现在它同时接受where子句和对WP_Query 类调用挂钩。

    那么真正的区别是什么呢

    实际上,过滤器挂钩几乎是动作挂钩的超集。前者可以做后者可以做的任何事情,甚至可以做得更多,尽管开发人员没有责任像使用过滤器挂钩那样使用操作挂钩返回值。

    提供指导和电报意图,但这可能并不重要。我认为重要的是,如果开发人员选择使用动作挂钩和过滤器挂钩,或者反之亦然,那么它们就是telegraphing their intent 因此giving guidance 可能正在使用挂钩的主题开发人员或插件开发人员。本质上,他们是在说“我会打电话给你,做你需要做的任何事”OR “我将向您传递此值以进行修改,但请确保您将其传回

    所以最终I think that guidance provided by the choice of hook type is the real value behind the distinction. 无论如何,在国际海事组织。

    希望这有帮助!

SO网友:trusktr

如果您查看add_action() 核心函数,它只是add_filter() 作用

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

那么这意味着什么呢?动作类似于过滤器,只是动作不返回值,所以不能修改数据。它表明,创建WordPress的操作机制很简单,只需复制过滤机制,而不返回值。基本上,操作所能做的就是简单地执行一个函数,而不修改某些值。

SO网友:maheshwaghmare

在简单的word中。

Actions 是执行输出的PHP函数

Filters 是返回输出的PHP函数

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

如何使用

操作:

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

示例一:(简单的PHP示例)

function test() {
     echo "Output";
}

test();
以上程序打印输出:

Output
[注意:此处test()只需调用函数。然后执行回调函数“test”。]


  1. 示例二:(动作的简单使用)
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。]

如果优先级发生变化,如优先级为1的“test1”和优先级为2的“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
现在,创建示例插件来检查它如何为第三方开发人员工作。

在中创建文件夹“simple”/wp-content/plugins/ 目录

/*
* 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\' ) 无需更改主题/插件文件。


SO网友:Jonathan Rhein

action 和afilter 可以总结如下:

一个动作获取它接收到的信息,对它做一些事情,但什么也不做。换句话说:它对某个对象进行操作,然后退出,不向调用挂钩返回任何内容用另一种方式说:

动作中断代码流以执行某些操作,然后返回到正常流,而不修改任何内容引用的内容是通过钩子定义发送的参数列表。

From the official WP documentation

结束

相关推荐

WordPress stats API key

每次WordPress统计更新时,我都需要提供API密钥。有没有办法让这一切自动化?