apply_filters 如何用于在 wordpress 中创建过滤器挂钩?
How can apply_filters be used to create a filter hook in wordpress?
WordPress documentation about apply_filters 提及:
It is possible to create new filter hooks by simply calling this function, specifying the name of the new hook using the $hook_name parameter.
好的,我想创建一个名为 the_content2
的过滤器挂钩,所以我按照文档的建议进行操作:
$custom_hook = apply_filters("the_content2", the_content());
现在我假设 the_content2
挂钩已创建并且类似于 the_content
。因此,在单个 post 页面上,我应该能够使用 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()
相关的主要问题,我会确定你想用它做什么。如果您想为所有实例转换该函数的结果,钩子可能是个好主意。但是,如果您有时只是想以不同的方式使用它,那么调用原始函数的自定义函数(没有钩子)会做一些事情并且 returns 它可能更合适。
编辑
下面是钩子系统如何工作的模拟。我已经对其进行了大量简化,但它应该可以让您大致了解它的工作原理。
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
的时候给数组key加个名字。然后,if有人调用apply_filters
/do_action
则查找key,如果存在则回调运行.
所以 add_filter
/add_action
必须先发生。它是“如果它真的发生了,我对 XYZ 很感兴趣”。在很多情况下它可能不会发生,但如果发生了,回调就会触发。
如果没有人注册回调,apply_filters
t/shouldn不会抛出错误,因为这完全是一个有效的案例。我经常编写可扩展供未来调用者使用的代码,但您会注意到,如果没有人添加过滤器,则会返回初始值。
WordPress documentation about apply_filters 提及:
It is possible to create new filter hooks by simply calling this function, specifying the name of the new hook using the $hook_name parameter.
好的,我想创建一个名为 the_content2
的过滤器挂钩,所以我按照文档的建议进行操作:
$custom_hook = apply_filters("the_content2", the_content());
现在我假设 the_content2
挂钩已创建并且类似于 the_content
。因此,在单个 post 页面上,我应该能够使用 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()
相关的主要问题,我会确定你想用它做什么。如果您想为所有实例转换该函数的结果,钩子可能是个好主意。但是,如果您有时只是想以不同的方式使用它,那么调用原始函数的自定义函数(没有钩子)会做一些事情并且 returns 它可能更合适。
编辑
下面是钩子系统如何工作的模拟。我已经对其进行了大量简化,但它应该可以让您大致了解它的工作原理。
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
的时候给数组key加个名字。然后,if有人调用apply_filters
/do_action
则查找key,如果存在则回调运行.
所以 add_filter
/add_action
必须先发生。它是“如果它真的发生了,我对 XYZ 很感兴趣”。在很多情况下它可能不会发生,但如果发生了,回调就会触发。
如果没有人注册回调,apply_filters
t/shouldn不会抛出错误,因为这完全是一个有效的案例。我经常编写可扩展供未来调用者使用的代码,但您会注意到,如果没有人添加过滤器,则会返回初始值。