插件系统如何工作(wordpress、mybb ...)?

Posted

技术标签:

【中文标题】插件系统如何工作(wordpress、mybb ...)?【英文标题】:How does plugin system work (wordpress, mybb ...)? 【发布时间】:2011-07-04 21:17:50 【问题描述】:

我很好奇插件是如何工作的,我只知道我们使用插件而不是更改代码,但是他们如何在不更改代码的情况下完成工作?编码新项目时应该考虑什么,以便它可以有插件?非常感谢你:D

【问题讨论】:

谢谢你告诉我这件事,因为我以前不知道,谢谢:D 您能分享一下您对这个主题的经验吗?你问这个问题已经有一段时间了。 【参考方案1】:

关于如何实现插件系统有多种变化。 Wordpress 使用一种非常常见的方案,通常被称为“钩子”。我不知道确切的实现,但它基本上是这样工作的:

// plugin.php script registers its own callback function
register_plugin("hook_type", "plugin_function_123");

function plugin_function_123($params)  ... 

hook_type 通常是动作名称或其他东西。当主应用程序运行通过特定点(或例如需要处理一些数据)时,它会调用所有注册的回调函数:

$output = call_plugins("hook_type", $param1, $param2);

这通常在幕后作为一个简单的循环实现:

foreach ($registered_plugins[$action] as $func) 
    $func($param1, $param2, ...);   // or call_user_func_

现在取决于钩子/动作类型存在哪些参数,以及是否需要任何结果文本。参数传递也存在差异(例如,某些回调需要 &$var 引用)。而一些插件系统则依赖于对象(如果不存在那么多不同的动作类型或者要使用更复杂的结构)。

【讨论】:

感谢您的详细回答:D 虽然标记为答案,但能否简单描述一下“它调用所有注册的回调函数”的方式? call_plugins() 函数如何知道钩子“hook_type”附加了哪些操作/过滤器? @WebDevron 在这个相当粗略的例子中,register_*call_plugins() 将共享一个例如全局数组$registered_plugins[] → 依次将任何函数/回调关联到标识符(例如“hook_type”)。 感谢您的快速重播。在阅读了您的评论和这个答案 (***.com/a/8336476/2300749) 之后,现在我很清楚它是如何工作的。再次感谢。

以上是关于插件系统如何工作(wordpress、mybb ...)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在wordpress中结合所有css文件的各种插件

如何整合视觉作曲家自定义wordpress主题

MYBB 警告 [2] count():参数必须是数组或实现 Countable 的对象 - 行:906

将 WordPress 插件集成到引导站点中

Wordpress 帮助(WPForms + PayPal 工作流程)

我的 WordPress 插件在用户部分无法正常工作