不改代码给 Z-Blog 加自定义字段:Metas + 插件两条路

· zblog · 阅读 16
摘要

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 + 前台模板手动取值(最轻)

不改任何核心文件,只做三步:

  1. 后台发文章时,把额外信息写进正文末尾或者某个约定位置——不行,这不叫字段。真正做法是在文章编辑页用 UEditor 的「源码」模式写一段 {key:value},然后靠脚本解析。太重。
  2. 更实际的是用 $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 就是为这种场景设计的,自己建表反而要自己处理文章删除时的级联清理。