Discuz 主站接入博客:保住 DIY 可控的数据源写法

本文摘要Discuz 主站接入博客:保住 DIY 可控的数据源写法目标本站用 Discuz 做主站,博客是独立的 Typecho。想实现一个很常见的诉求:让主站首页展示博客的最新文章带封面图,方便两边互相导流。看起来简单,真做下来发现有个关键权衡——能不能保住后台 DIY 的可控性。本文记录完整过程供后续参考。过程问题:先求「能显示」,差点坏了结构Discuz 门户首页的板块,是后台「DIY」拖拽出来的,...

Discuz 主站接入博客:保住 DIY 可控的数据源写法

Discuz 主站接入博客封面

目标

本站用 Discuz 做主站,博客是独立的 Typecho。想实现一个很常见的诉求:让主站首页展示博客的最新文章带封面图,方便两边互相导流。

看起来简单,真做下来发现有个关键权衡——能不能保住后台 DIY 的可控性。本文记录完整过程供后续参考。

过程

问题:先求「能显示」,差点坏了结构

Discuz 门户首页的板块,是后台「DIY」拖拽出来的,数据源是内置的那几种(帖子、文章、会员等)。要让板块显示外部博客,官方没有现成选项,只能自己造一个数据源。

一开始图省事,我写了个自定义 block,直接改掉首页一个现成板块的数据源。结果 DIY 后台里这个板块的标题改不动了——因为动了原有结构,把 DIY 对它的可编辑性破坏了。

这个教训值得记牢:

自定义数据源,一定要做成"独立新增"的模块,让 DIY 列表里能选中它;不要图省事去改现有板块,否则会破坏 DIY 可控性。 目标是给用户一把好用的工具,而不是交出去一份被改乱的布局。

正解:写一个标准的 DIY 数据源

Discuz 的 DIY 数据源有固定套路,照系统自带模块(或站上某个插件自带的模块)写即可。我加了一个「博客·逸说」数据源,含两个文件,放进独立的 source/class/block/blogrss/ 目录(纯新增,不碰别人):

  • 分类定义 blockclass.php:告诉 DIY 这是哪一类
  • 数据源类 block_xxx.php:真正去拉博客 RSS 的地方

关键在于 getdata() 的返回格式:要返回一个标准的数据数组,每个元素带 id / idtype / url / title / pic / dateline 字段,而不是把拼好的 HTML 直接塞回去。走官方的数据数组通道,Discuz 才会把它当“正规模块”处理——才能正常选模板、改标题、设条数、按 cachetime 自动刷新。

写完后跑到服务器上重建一次 Discuz 缓存,这个数据源就出现在 DIY 列表里了。之后在后台 DIY 新增板块、选它、套个图文列表模板,即搞定。

效果

入口:主站首页 DIY → 新增模块 → 数据源选「博客·逸说」。

现在主站首页有一格「YISHUO 逸说 · 博客精选」,三宫格展示博客最新三篇带图文章,点标题新窗口跳去博客看全文,一小时自动刷新。以后博客更文,板块不用管,自己会跟着变。

整套是纯新增:没动任何现有板块和模板。哪天想撤,删掉那个目录再重建缓存就行,干净利落。

复盘

正确做法

  • 自定义 DIY 数据源走独立目录 + 数据数组 + idtype 的标准通道,而不是改现有板块。
  • 返回 data 数组而非拼好的 HTML,Discuz 才当正规模块处理,DIY 全部能力(选模板/改标题/设条数/自动刷新)才可用。

踩坑备忘

  • Typecho 的图是懒加载:正文图片真实地址在 data-src 属性里,src 只是占位图。要优先取 data-src,并跳过 lazy-loading / thumb.svg 这类占位。
  • content:encoded 标签带属性:抓正文时要写成 content:encoded[^>]*>,否则匹配不到内容。
  • CLI PHP 与网页 PHP 不同:群晖的命令行 PHP 没装 mysqli,直接跑 Discuz 缓存会报 mysqli_report() 未定义。要用走网页的方式触发缓存重建。
  • 改完类不生效:站点开了 opcache,改完 PHP 文件要让它刷新,否则一直在跑旧代码。

参考

觉得内容不错?我要

评论 暂无评论
暂无评论,快来抢沙发吧~