一个关于 "分类焦虑" 的真实故事
你有没有过这种经历?论坛版块越开越多,导航栏从 "简洁优雅" 变成了 "春运火车站大屏"。
原版 Xiuno BBS 说:我支持二级分类!够你用了吧?
你说:够…… 吧。
然后三个月后,你的 "资源分享" 下面挂了 47 个子版块,其中 "软件资源" 下面又想分 "Windows""Mac""Linux"" 安卓 "……
二级分类?那叫平房。我要住复式。

于是这个插件诞生了
xn_forum_level_3 —— 不是简单地给你加一层分类,是给你的论坛装了一部电梯。
- 三级版块:一级当爹,二级当儿子,三级当孙子,祖孙三代其乐融融
- 前台导航下拉:鼠标往一级版块上一搁,二级分类齐刷刷从下面冒出来,有三级的还会往右边再弹一层,丝滑得像德芙
- 后台可视化管理:拖拽?没有。但增删改查该有的都有,颜色还区分了层级(红的是大当家,黄的是二当家,绿的是…… 三当家)
- PHP 8 兼容:在别人还在为
each()被移除哭天抢地时,这个插件已经用上了类型声明和空安全运算符,优雅得不像实力派
关于删除子版块这件事,说多了都是泪
你以为加个三级分类就完了?
天真。
开发过程中最惨烈的战斗,不是写三级树结构,而是删除一个没有帖子的子版块。
原生 Xiuno 说:删版块?先看看有没有帖子。哦,threads 字段是 0?那我再去 thread 表里确认一下…… 什么,你说真的没有?我不信,我弹个框 "请先通过批量主题管理删除该主题"。
插件作者:???
于是我们经历了:
- 第一次:hook 没触发,原生提示岿然不动
- 第二次:换了个 hook,500 Internal Server Error
- 第三次:try-catch 安排上,终于能删了 —— 但删完页面不刷新,版块还在那杵着,像在嘲笑你
- 第四次:哦,原来
app.forumlist是索引数组不是关联数组,delete app.forumlist[fid]删了个寂寞
最终方案:完全绕过原生删除接口,自己写 SQL 删,前端用 filter 实时更新视图。 简单粗暴,但管用。
现在删除子版块的体验是:点一下 → 确认 → 唰,没了。干净利落,像拔掉了一根早就该拔的智齿。
下拉菜单的宽度,是一种哲学
你以为下拉菜单做出来就完了?
用户说:太宽了。
改。
用户说:跟上面不对齐。
改。
用户说:还是不好看。
改。
最终方案:JS 动态获取导航项的 getBoundingClientRect().width,下拉菜单宽度精确到像素级对齐。 强迫症福音,处女座狂喜。
而且二三级版块在导航栏里会被自动隐藏,不再像牛皮癣一样贴在后面。你的导航栏终于恢复了它本该有的尊严。

技术细节(给想看的人)
- 数据库:
forum表加一个fup int unsigned字段,记录父版块 ID - 前台:纯原生 JS,固定定位全局下拉,双 hook 兜底(
body_end+footer_end),防重复执行标记 - 后台:覆盖
forum_list.htm模版,Vue.js 三级树渲染 - 删除:自定义 POST 参数
action=xn_delete_forum触发,try-catch包裹,直接 SQL 级联删除 - 兼容:PHP 8.0+,MySQL 5.7/8.0+,Xiuno BBS 4.0/5.0
最后
如果你也在被二级分类的天花板压得喘不过气,如果你的导航栏已经长到需要横向滚动,如果你的 "资源分享" 下面已经塞不下更多子版块 ——
试试这个插件。
三级分类,不是终点,是你终于可以不用再把 "Windows 软件" 和 "Mac 软件" 塞在同一个叫 "软件" 的版块里的开始。
毕竟,谁不想住复式呢?
插件版本 2.2,兼容 PHP 8+,后台禁用再启用即可生效。有问题别找作者,作者已经被删除功能折磨瘦了三斤。
-
版块三级分类2.2.zip2 金币