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