use*_*782 1 php wordpress hook filter
关于 apply_filters 的WordPress文档提到:
只需调用此函数,并使用 $hook_name 参数指定新钩子的名称,就可以创建新的过滤器钩子。
好的,我想创建一个名为 的过滤器挂钩the_content2,所以我按照文档的建议进行操作:
$custom_hook = apply_filters("the_content2", the_content());
Run Code Online (Sandbox Code Playgroud)
现在我假设the_content2hook 已创建并且类似于the_content. 所以在单个帖子页面上我应该能够使用the_content2像这样的钩子the_content2:
the_content2()
这会引发错误,函数未定义。我是 WordPress 的初学者,有人可以全面解释一下如何apply_filters创建自己的过滤器吗?
钩子(动作和过滤器)有两个主要组件,声明钩子的部分和实现钩子的回调。
一个非常简单的例子是:
$name = "Chris";
$name = apply_filters("change_name", $name);
echo $name;
Run Code Online (Sandbox Code Playgroud)
如果没有人注册回调,Chris则会输出 then 。但是,如果有人这样写:
add_filter(
    "change_name",
    function($name){ return "Steve";}
);
Run Code Online (Sandbox Code Playgroud)
然后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;
}
Run Code Online (Sandbox Code Playgroud)
我怎么强调都不为过,没有人真正声明或登记事情。使用add_filter/时最多添加一个数组键和一个名称。add_action然后,如果有人调用apply_filters/ do_action,则查找该键,如果存在,则运行回调。
所以add_filter/add_action必须首先发生。它是“我对 XYZ 感兴趣,如果它真的发生了”。在很多情况下,它可能不会发生,但如果发生了,回调就会触发。
如果没有人注册回调,则不能apply_filters/不应该抛出错误,因为这完全是一种有效的情况。我经常编写可供未来调用者扩展的代码,但您会注意到,如果没有人添加过滤器,则返回初始值。