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