插件开发指南
插件目录结构
plugins/myplugin/
├── plugin.json # 插件元数据(必需)
├── plugin.php # 插件入口(必需)
└── ... # 插件自己的资源、模板等plugin.json
{
"name": "我的插件",
"slug": "myplugin",
"version": "1.0.0",
"description": "插件功能简介",
"author": "作者名",
"default_settings": {
"enabled_badge": { "type": "checkbox", "default": "1" }
},
"dependencies": {},
"changelog": [
{ "version": "1.0.0", "notes": "首个版本" }
]
}- 必填字段:
name、slug、version、description、author; slug必须为小写字母/数字/下划线(2~50 位)且与目录名完全一致;version遵循 SemVer(如 1.0.0);default_settings声明的配置项会出现在后台插件设置中。
插件入口类
plugin.php 定义入口类,类名为 slug 的帕斯卡形式加 Plugin 后缀(如 myplugin → MypluginPlugin),继承 PluginBase:
class MypluginPlugin extends PluginBase
{
public function __construct($plugin)
{
parent::__construct($plugin);
// 监听系统钩子
Hook::listen(Hook::ARTICLE_VIEW_AFTER, [$this, 'onArticleView']);
}
public function onArticleView($article)
{
// 文章被浏览后的处理逻辑
}
}系统加载插件时读取 plugin 表中启用的记录,require 对应 plugin.php 并实例化入口类——构造函数里完成全部钩子注册。
系统钩子
钩子中心(core/lib/Hook.php)按对象分组,命名统一为 对象_动作_before/after:
- 用户:
user_login_before/after/failed、user_register_before/after、user_profile_update_*、user_password_change_*、user_delete_*、user_ban_*、user_follow_*等; - 文章:
article_create_*、article_update_*、article_delete_*、article_publish_*、article_view_*、article_like_*、article_favorite_*、article_search_*等; - 评论:
comment_add_*、comment_approve_*、comment_reply_*、comment_like_*等; - 页面/分类/标签:
page_create_*、category_update_*、tag_delete_*等; - 系统:
system_init、system_shutdown、system_cache_clear、system_backup_*、system_config_update、system_cron、system_error; - 上传:
file_upload_before/after/error、file_delete_*; - 通知/邮件:
send_notification、email_send_*; - 后台:
admin_login_*、admin_logout_*; - 配置扩展:
admin_config_collect_custom(插件把自定义设置项注入后台保存流程)。
完整常量清单以 Hook.php 源码为准。
模板挂载点
主题模板中的 {plugin_hook name="自定义钩子"} 标签会执行该钩子上注册的插件逻辑并输出返回内容——插件可借此向页面注入组件(侧边栏挂件、统计代码等)。
调试与日志
后台「钩子管理」可查看每个钩子的触发日志、手动测试钩子、清理日志,是排查插件执行时序问题的首选工具。
打包上架
压缩插件目录(顶层目录名与 slug 一致)后,可提交到官网应用市场。上架前请确认:元数据完整、PHP 语法通过、禁用/启用/卸载流程无残留。