不改代码给 Z-Blog 加自定义字段:Metas + 插件两条路
Z-Blog 的「字段」概念比较特殊:核心没有 WordPress 那种「自定义字段」编辑器面板,但底层 zbp_postmeta 表一直都在,只是没有现成 UI。想给文章加字段又不想动模板代码,下面两条路任选。 先弄清楚数据存在哪 文章
Z-Blog 的「字段」概念比较特殊:核心没有 WordPress 那种「自定义字段」编辑器面板,但底层 zbp_postmeta 表一直都在,只是没有现成 UI。想给文章加字段又不想动模板代码,下面两条路任选。
先弄清楚数据存在哪
文章主表 zbp_post 的列是固定的(ID、标题、正文、分类、别名、时间…),加不了列。Z-Blog 的做法是把额外数据塞进 zbp_postmeta,结构就三列:meta_id、meta_postid、meta_key、meta_value。所以「加字段」的本质是往这张表写 key-value。
路线一:Metas + 前台模板手动取值(最轻)
不改任何核心文件,只做三步:
- 后台发文章时,把额外信息写进正文末尾或者某个约定位置——不行,这不叫字段。真正做法是在文章编辑页用 UEditor 的「源码」模式写一段
{key:value},然后靠脚本解析。太重。 - 更实际的是用
$article->Metas->name直接读。Z-Blog 的Post对象有Metas属性,只要这张表里有记录:
// 在模板里
{$article.Metas.subtitle}
{$article.Metas.cover}
问题在于:核心后台没有编辑这个字段的入口,除非你装了带该功能的插件,或者手动 INSERT 数据库。
手动写入 SQL:
INSERT INTO zbp_postmeta (meta_postid, meta_key, meta_value)
VALUES (31, 'subtitle', '这是副标题');
写入后前台 {$article.Metas.subtitle} 立刻能取到。这就是「不改代码加字段」的最小实现——代码确实没改,但你得记着每次手动写库。
路线二:写个小插件挂后台表单(推荐)
要让编辑文章时能看见输入框,必须挂两个钩子:
Filter_Plugin_Admin_ArticleEdit_Begin:在编辑页表单里插入输入框Filter_Plugin_ArticlePst_Begin:保存时把值写进 Metas
插件入口 include.php 大致长这样:
RegisterPlugin('MyFields', 'ActivePlugin_MyFields');
function ActivePlugin_MyFields() {
Add_Filter_Plugin('Filter_Plugin_Admin_ArticleEdit_Begin', 'MyFields_Form');
Add_Filter_Plugin('Filter_Plugin_ArticlePst_Begin', 'MyFields_Save');
}
function MyFields_Form() {
global $article;
$sub = isset($article->Metas->subtitle) ? $article->Metas->subtitle : '';
echo '<div class="form-group"><label>副标题</label><input name="meta_subtitle" value="'.$sub.'"></div>';
}
function MyFields_Save(&$article) {
if (isset($_POST['meta_subtitle'])) {
$article->Metas->subtitle = $_POST['meta_subtitle'];
}
}
两条路线怎么选
| 对比项 | 路线一(手动写库) | 路线二(插件) |
|---|---|---|
| 改代码 | 不改 | 写插件,但不改核心 |
| 编辑体验 | 无 UI,纯 SQL | 后台自带输入框 |
| 上手成本 | 5 分钟 | 30 分钟 |
| 适合场景 | 临时、单条、调试 | 常态化运营 |
FAQ
Q:{$article.Metas.xxx} 在模板里取不到?
A:先确认 zbp_postmeta 里真有这条记录,且 meta_postid 对得上。Z-Blog 的 Metas 是懒加载的,取不到一般就是库里没有。
Q:改了 Metas 需要清缓存吗?
A:Metas 不走模板编译缓存,直接读库,通常立刻生效。如果前台还是旧的,是页面缓存或 CDN,清缓存中心即可。
Q:能不能做成独立表?
A:可以,但意义不大。Metas 就是为这种场景设计的,自己建表反而要自己处理文章删除时的级联清理。