插件开发在线文档:https://site.ikunwl.com/data/docs/#ch4
1 插件目录结构
插件放在 plugins/{插件名}/ 目录下,目录名即插件名(小写字母/数字/连字符)。一个完整插件可包含以下文件:
plugins/myplugin/
plugin.json 元数据声明(必需)
include.php 主文件:类/函数定义 + 钩子注册(可选,由 plugin.json 的 main_file 指定)
main.php 后台设置面板:注册设置 Tab 钩子(可选,由 config_file 指定)
schema.php 数据库声明:表、字段、默认配置(可选,固定文件名)
api.php 开放 API 接口声明(可选):需在 plugin.json 声明 api_file 才会被加载,启用后自动注册 /api/open/* 接口并出现在后台「API 密钥」文档(见 4.2 与 data/docs/api-guide.md)
admin.php 独立后台管理页面(可选;插件目录存在该文件时后台自动显示「管理」按钮)
settings.php 插件内部自用页面/片段(可选,按需命名,如 article/spider 插件)
css/ 插件样式(可选,Plugin::asset() 引用)
js/ 插件脚本(可选)
加载机制
- include.php:仅在插件启用时由
Plugin::init()(core/bootstrap.php 调用)加载,用于定义类/函数并注册前台与后台钩子 - main.php:仅在插件启用时随 include.php 一起加载,用于注册设置 Tab 钩子(
admin_settings_nav+admin_settings_tabs) - schema.php:仅在插件启动(ensureSchema)与卸载(uninstall)时由
Plugin::loadSchema()加载,返回声明数组 - api.php:由
core/OpenApi.php按需加载。插件启用后,其中声明的接口自动注册到/api/open/*(需 API Key),并自动出现在后台「API 密钥」使用说明;停用后接口失效(返回 403 / 40301)。声明格式与内置参考见data/docs/plugin-dev.md与plugins/article/api.php - admin.php:通过
/admin/plugin.php?p=插件名访问。分发器会先校验插件已启用并输出后台公共头尾;由于引导阶段已执行Plugin::init(),include.php 中定义的类/函数可直接使用,无需手动 include - 未启用的插件完全不加载,不注册任何钩子、不执行任何代码;其 admin.php 也无法访问
所有 PHP 文件开头建议加安全检查,阻止被直接 URL 访问(各内置插件统一写法):
?php
if (!defined('APP_VERSION') || !class_exists('Database')) {
die('Forbidden');
}
`
2 plugin.json 配置
每个插件根目录必须有 plugin.json,由 Plugin::getInfo() 读取并与默认值合并:
{
"name": "myplugin",
"title": "我的插件",
"version": "1.0",
"author": "你的名字",
"description": "插件功能描述",
"main_file": "include.php",
"config_file": "main.php",
"config_tab": "myplugin",
"schema_file": "schema.php",
"hooks": ["sidebar_top", "after_footer"],
"tables": ["mytable"],
"builtin": true
}
| 字段 | 必填 | 说明 |
|---|---|---|
name |
是 | 插件目录名(必须与文件夹一致),用于启用状态键 plugin_{name}_enabled 与配置前缀 |
title |
是 | 显示名称(默认取目录名) |
version |
否 | 版本号(默认 1.0) |
author |
否 | 作者 |
description |
否 | 功能描述(后台插件列表展示) |
main_file |
否 | 主文件名(默认 {name}.php,内置插件统一设为 include.php) |
config_file |
否 | 后台设置面板文件名(如 main.php);无设置项则不填 |
api_file |
否 | 开放 API 声明文件名(如 api.php)。必须显式声明,core/OpenApi.php 才会加载它以注册 open/* 接口;未声明一律不加载——防止把"请求处理器"型文件(如 appcenter 的 api.php)误当作声明文件 include |
config_tab |
否 | 设置 Tab 的 ID(默认等于插件名);当 Tab ID 与插件名不同时需指定,后台「设置」按钮据此跳转(admin/plugins.php) |
schema_file |
否 | 信息性字段——系统实际固定读取 schema.php,无需配置 |
hooks |
否 | 声明使用的钩子列表(后台插件列表展示,不影响实际注册——注册靠 include.php/main.php 中的 Plugin::registerHook()) |
tables |
否 | 声明创建的表名列表(卸载共享表判断的补充来源) |
builtin |
否 | 是否为内置插件(默认 true,后台列表显示「内置」标签) |
注意:插件启用状态不写在 plugin.json 中,而是由系统管理在 settings 表(plugin_{name}_enabled,安装时写入 0)。
其他详见插件开发文档~偷偷说一句,可以把文档丢给 AI,就可以写插件了哦,文档很完善了,期待你的插件,做好插件可以在:> 茶馆 < 分享插件,也可以在:> 反馈 < 反馈你所遇到的问题。