如何像 WordPress 中一样为自定义 CMS 创建挂钩?

问题描述 投票:0回答:2

当我发现 WordPress 挂钩(例如操作和过滤器)时,您可以仅通过一个自定义函数及其挂钩来修改或更改整个 CMS 功能,这给我留下了深刻的印象。我正在寻找方法或架构模式甚至代码示例,这将解释它是如何工作的。您必须向自定义类(例如)写入什么才能允许您更改某些核心功能?无论CMS还是编程语言。它可以是 WordPress 或自定义 JS/PHP CMS。

javascript php laravel wordpress express
2个回答
0
投票

这可以通过多种方式完成,但基本概念非常简单。为此,我将向您展示 WordPress 使用这两个函数在高层次上做什么:

apply_filters($name, $value, …$context)
{
    global $filters;
    foreach($filters[$name] ?? [] as $callback) {
        $value = $callback($value, …$context);
    }
    return $value;
}

add_filter($name, $callback)
{
    global $filters;
    if(!isset($filters[$name])){
        $filters[$name] = [];
    }
    $filters[$name][] = $callback;

}

add_filter
函数是程序员表达他们对更改某些内容的兴趣的地方。
$name
参数由 WordPress 定义,对于代码中使用的位置是唯一的(或者只要多个调用者都对数据执行相同的操作就足够唯一)。
$callback
参数是自定义代码,用于对数据执行某些操作并返回某些内容。这里的所有内容都存储在全局数组中。

apply_filters
函数是 WordPress 代码在全局数组上循环查找特定命名键的地方,该数组返回一个子数组,其中每个元素都是回调。然后,它使用感兴趣的特定
$value
以及某人可能需要的任何可选
$context
来调用每个回调。

我在这里缺少一些理智检查,但这就是要点。在 WordPress 的例子中,实际上有一个专门的过滤器对象存储在全局数组中,并且有优先级,因此程序员可以暗示他们的

$callback
注册的顺序。

核心代码中的用法非常简单:

// Normal code here
$data = get_data();
// See if anyone wants to change it
$data = apply_filters('after_get_data', $data);
// Back to normal code

操作与过滤器类似,在 WordPress 的例子中,它们共享相同的核心逻辑。唯一的主要区别是操作不返回任何内容,但在其他方面共享公共

$name
的相同模式以及一些可选参数。

WordPress 允许扩展的另一种方式是通过可插入代码。基本上,有一个文件加载得很晚,其中包含一堆包含在

if(!function_exists('…')){}
中的函数。这允许其他程序员创建这些函数,并且 WordPress 将使用程序员版本而不是核心版本。


0
投票

你也许可以检查一下这个:https://github.com/SneherAdor/laravel-hooks

这很简单,但就像 WordPress 一样。这对于 Laravel 中的模块或插件系统来说非常棒

© www.soinside.com 2019 - 2024. All rights reserved.