apply_filters如何在wordpress中创建一个过滤器钩子?



关于apply_filters的Wordpress文档提到:

可以创建新的过滤器钩子只需调用这个函数,使用$hook_name参数指定新钩子的名称。

好的,我想创建一个名为the_content2的过滤器钩子,所以我按照文档的建议做:

$custom_hook = apply_filters("the_content2", the_content());

现在我假设创建了the_content2钩子,并且与the_content类似。所以在一个单一的帖子页面上,我应该能够使用the_content2钩子,如the_content2:

the_content2()

抛出错误,函数未定义。我是wordpress的初学者,有人可以全面解释如何使用apply_filters来创建自己的过滤器吗?

钩子(动作和过滤器)有两个主要组件,声明钩子的部分和实现钩子的回调。

一个非常简单的例子是:

$name = "Chris";
$name = apply_filters("change_name", $name);
echo $name;

如果没有人注册回调,则输出Chris。但是,如果有人这样写:

add_filter(
"change_name",
function($name){ return "Steve";}
);

则输出Steve

在任何情况下,都不会创建一个名为change_name()的新函数

当涉及到钩子时,我通常会引导你不要去想钩子是"被创造"的,而应该把它想成是"被命名"的。函数总是存在的,但是钩子只在实际调用时使用。

你的主要问题,因为它涉及到the_content(),我会决定你想做什么。如果您想为所有实例转换该函数的结果,那么使用钩子可能是个好主意。然而,如果你只是想用不同的方式使用它,一个自定义函数(没有钩子)调用原始函数,做一些事情并返回它可能更合适。

编辑

下面是钩子系统如何工作的模拟。我已经简化了很多,但它应该给你一个它是如何工作的要点。

function add_filter($name, $callback) {
global $filters;
$filters[$name][] = $callback;
}
function apply_filters($name, $value) {
global $filters;
if(array_key_exists($name, $filters)) {
foreach($filters[$name] as $callback) {
$value = $callback($value);
}
}
return $value;
}
我不能强调这一点,没有人真正的声明注册的东西。当使用add_filter/add_action时,最多添加一个带有名称的数组键。然后,如果有人调用apply_filters/do_action,则查找键,如果它存在,则运行回调。

所以add_filter/add_action必须先发生。它是"我对某某很感兴趣,如果它真的发生了"。在很多情况下,它可能不会发生,但如果发生了,那么回调将会触发。

如果没有人注册回调,apply_filters不能/不应该抛出错误,因为这完全是一个有效的情况。我经常为将来的调用者编写可扩展的代码,但您会注意到,如果没有人添加过滤器,则返回初始值。

最新更新