最近,我一直在更深入地研究插件API,我想知道操作钩子和过滤器钩子之间的真正区别是什么。它们都是接收数据作为参数的事件,它们似乎都可以执行相同的操作。

很明显,我看到在执行操作时调用了操作,在处理数据时调用了过滤器,但这似乎只是语义命名上的区别。

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

#1 楼

@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中返回变量是可选的。谁知道WordPress开发人员为什么选择使用两个单独的术语?纯粹是出于语义原因吗?从技术上讲,我看不到有必要...

– TheStoryCoder
2015年6月10日下午7:27

@TheStoryCoder“这纯粹是出于语义原因吗?”似乎正是我的答案在五(5)年前所解释的...?

– MikeSchinkel
15年6月13日在23:13

#2 楼

如果您看一下add_action()核心功能的源代码,它只是add_filter()核心功能的包装...

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

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

#3 楼

用简单的话来说。


操作是执行输出的PHP函数。

过滤器是返回输出的PHP函数。


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


如何使用?

操作:

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


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


function test() {
     echo "Output";
}

test();


以上程序打印输出:

Output


[注意:在这里,test()只需调用函数即可。并执行回调函数'test'。]示例二:(简单使用Action)


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。]

如果优先级像'test1'那样更改优先级1和优先级为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


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


/wp-content/plugins/目录中创建文件夹“ simple”。
创建名为“ 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' ),而没有更改主题/插件文件。



评论


感谢@maheshwaghmare这样的简单技巧。请也写关于“过滤器”的内容

–阿迪
17年2月22日在10:59

“很快”到底是什么意思?

– Rapti
17年4月4日在13:15

@Rapti对不起,谢谢您。今晚,我将添加与过滤器有关的答案。将来,我将创建有关Hooks(Actions&Filters)的描述性文章。

–maheshwaghmare
17年4月4日在14:02

@maheshwaghmare拖延了多少? :P

–user118973
17年5月4日在1:37

很好的解释,我现在有了更好的理解

– Budianto IP
18年2月11日在18:01

#4 楼

动作和过滤器之间的主要区别可以总结如下:

动作将接收到的信息用于接收信息,并对其执行某些操作,而
则不返回任何内容。换句话说:它作用于某个东西,然后退出,
不返回任何内容给调用钩子。
过滤器获取它接收到的信息,以某种方式对其进行修改,然后返回它。换句话说:它过滤掉某些东西并将其传递回
钩子以供进一步使用。

以另一种方式说:

一个动作中断了代码流的执行某些内容,然后不进行任何修改就返回到正常流程;
过滤器用于以特定方式修改某些内容,以便以后代码可以使用
修改。 br />
所指的是通过钩子定义发送的参数列表。
摘自官方WP文档