wordpress插件设计初体验

436 阅读1分钟

为什么是插件化设计

WordPress开发有一个基本准则,那就是:不要改变 WordPress 内核,也就是说,不要通过编辑 WordPress 核心文件来为网站添加功能。

初始化的WordPress只有少数几个数据库表,几乎没有什么业务功能,基于插件机制可以灵活地开发出各种各样的需求。

插件是如何加载

在初始化上下文环境时,会载入激活的插件,插件是否激活是保存在option数据库表中(操作类wp-includes\option.php),并执行插件的plugin_loaded方法:

#4 require_once(\wordpress\wp-admin\admin.php) called at [\wordpress\wp-admin\index.php:10]
#3 require_once(\wordpress\wp-load.php) called at [\wordpress\wp-admin\admin.php:34]
#2 require_once(\wordpress\wp-config.php) called at [\wordpress\wp-load.php:50]
#1 require_once(\wordpress\wp-settings.php) called at [\wordpress\wp-config.php:96]
#0 include_once() called at [\wordpress\wp-settings.php:409]
foreach ( wp_get_active_and_valid_plugins() as $plugin ) {
	include_once $plugin;
	do_action( 'plugin_loaded', $plugin );
}

hello_dolly - 看插件钩子的使用

这是系统初始化自带的一个例子,用于演示插件基础使用,该插件定义了两个钩子回调:

  • 绑定admin_notices钩子回调:该钩子由系统调用,位于wp-admin\admin-header.php,在渲染模板时触发,会在页面中插入一句随机文字;
  • 绑定admin_head钩子回调:同上,区别是触发位置在渲染模板的header中,用于渲染css;

加载插件时,调用add_action(xxx)添加事件钩子回调,所有的插件钩子都使用全局变量$wp_filter保存,操作方法位于\wordpress\wp-includes\plugin.php;

当代码执行do_action(xxx)时,便会激活上述添加的回调函数;

插件是如何安装

进入插件页面安装插件时,会调用wp_ajax_install_plugin()从远程服务器下载插件zip包,然后自动解压到插件目录。下载的插件以文件形式存储在wp-content\plugins;

其他

过多的钩子函数也会造成代码流程晦涩难懂,违背了原本解耦合可扩展的设计初衷,如何平衡系统的复杂度还需要进一步探究。

参考资料

WordPress智库