可以,而且 Discuz X3.5 完全可以实现。你截图里的 New 本质上就是“帖子标题旁边的一个小标签/图标”,我们可以照着这个思路做成:
[经验] 推荐一个网站 🔵
[杂谈] 某某问题 🟢
某会员专属帖子 👑
版主发布 🔴
VIP会员发布 💎
普通会员发布 🔵
而且可以做到不改变帖子标题本身,只在标题后面增加一个图标。
一、先说清楚 Discuz X3.5 的实现原理
Discuz 帖子列表通常是:
forumdisplay_list.htm
↓
读取 $threadlist
↓
循环每一个帖子
↓
显示 $thread[subject]
所以我们真正要做的,就是把:
$thread[subject]
变成:
$thread[subject] + 一个自定义图标
例如最终 HTML:
<a href="forum.php?mod=viewthread&tid=123">
这是一个帖子
</a>
<span class="my_thread_icon icon_vip">VIP</span>
然后通过 CSS 把它做成截图里面类似 New 的小标签。
二、最简单的方法:直接根据“帖子类型”显示不同图标
这个方法我最推荐,因为:
不需要改数据库,不需要插件,不需要查询用户组,兼容性最好。
例如你可以规定:
| 帖子类型 |
显示 |
| 经验 |
🟢 经验 |
| 杂谈 |
🔵 杂谈 |
| 教程 |
🟣 教程 |
| 公告 |
🔴 公告 |
| 分享 |
🟠 分享 |
Discuz 本身就有“主题分类”,所以非常适合实现。
三、找到 Discuz X3.5 帖子列表模板
你的 Discuz X3.5 默认模板一般在:
/template/default/forum/forumdisplay_list.htm
如果你使用的是自定义模板,例如:
/template/你的模板/forum/forumdisplay_list.htm
就修改你实际正在使用的模板。
千万不要直接修改默认模板后又切换模板,否则看不到效果。
四、先找到显示帖子标题的代码
打开:
/template/你的模板/forum/forumdisplay_list.htm
搜索:
$thread[subject]
一般会看到类似:
<a href="forum.php?mod=viewthread&tid=$thread[tid]&extra=$extra" onclick="atarget(this)" class="s xst">$thread[subject]</a>
或者类似:
<a href="forum.php?mod=viewthread&tid=$thread[tid]&extra=$extra">
$thread[subject]
</a>
你不需要管具体 HTML 长什么样。
核心就是找到 $thread[subject]。
五、先做一个最简单的“NEW图标”
假设原来:
<a href="forum.php?mod=viewthread&tid=$thread[tid]" class="s xst">$thread[subject]</a>
改成:
<a href="forum.php?mod=viewthread&tid=$thread[tid]" class="s xst">$thread[subject]</a>
<span class="my_thread_icon icon_new">NEW</span>
然后找到:
/template/你的模板/common/common.css
在里面增加:
.my_thread_icon {
display: inline-block;
margin-left: 6px;
padding: 1px 5px;
border-radius: 3px;
font-size: 11px;
line-height: 16px;
color: #fff;
vertical-align: middle;
}
.icon_new {
background: #f60;
}
这样就会出现:
帖子标题 NEW
效果就已经和你截图中的思路非常接近了。
六、但是你真正想要的是“根据不同用户组自动显示”
这个就更有意思了。
比如:
超级版主 → 👑
版主 → 🔴
VIP会员 → 💎
普通会员 → 🔵
新手会员 → 🟢
那么我们不能简单地固定显示:
NEW
而应该根据:
发帖人 → 用户组 → 图标
自动决定。
七、Discuz 用户组最重要的字段:groupid
Discuz 用户通常有:
uid
groupid
extgroupids
其中:
groupid
就是主要用户组。
例如:
groupid = 1
管理员
groupid = 2
超级版主
groupid = 3
版主
groupid = 10
普通会员
注意:你的论坛实际 groupid 不能直接照抄我的数字。
因为不同 Discuz 论坛配置可能不一样。
八、先找到你自己的用户组 ID
进入 Discuz 后台:
管理中心
→ 用户
→ 用户组
查看每个用户组。
例如你的论坛可能是:
管理员 1
超级版主 2
版主 3
VIP会员 20
普通会员 10
新手会员 22
记下来。
九、比较重要:不要在模板里直接每个帖子查询一次数据库
很多人会这么写:
$member = C::t('common_member')->fetch($thread['authorid']);
然后帖子列表有 50 个帖子:
查询用户1
查询用户2
查询用户3
查询用户4
……
查询用户50
这就属于:
N+1 查询
帖子少的时候没感觉。
你的论坛帖子多、访问量高以后,就不漂亮了。
所以我建议:
先在 PHP 中给 $threadlist 增加一个自定义字段,然后模板只负责显示。
十、推荐的专业做法
假设你的目标是:
管理员 → ADMIN
超级版主 → SUPER
版主 → MOD
VIP → VIP
普通用户 → USER
我们给每个帖子增加:
$thread['my_icon']
例如:
$thread['my_icon'] = 'vip';
模板只需要:
<span class="thread_icon thread_icon_$thread[my_icon]">
VIP
</span>
这种方式非常干净。
十一、修改 forumdisplay.php
找到:
/forum.php
你不要改这个。
我们需要找的是:
/source/module/forum/forumdisplay.php
打开:
/source/module/forum/forumdisplay.php
搜索:
$threadlist
你会找到生成帖子列表的地方。
不同 X3.5 小版本、模板以及是否修改过代码,具体上下文会有差异,所以这里我不建议让你凭我的行号直接覆盖代码。
我们应该在:
$threadlist
已经获取完成以后,对它进行处理。
十二、加入自动识别用户组
例如:
foreach($threadlist as $key => $thread) {
$authorid = intval($thread['authorid']);
if(!$authorid) {
$threadlist[$key]['my_icon'] = 'guest';
continue;
}
$member = C::t('common_member')->fetch($authorid);
$groupid = intval($member['groupid']);
switch($groupid) {
case 1:
$threadlist[$key]['my_icon'] = 'admin';
break;
case 2:
$threadlist[$key]['my_icon'] = 'super';
break;
case 3:
$threadlist[$key]['my_icon'] = 'mod';
break;
case 20:
$threadlist[$key]['my_icon'] = 'vip';
break;
default:
$threadlist[$key]['my_icon'] = 'user';
break;
}
}
但是这里我再强调一次:
上面的 1、2、3、20 只是示例,你必须换成你自己的 groupid。
十三、更进一步:不要显示文字,而是显示真正的小图片
例如你准备:
admin.png
super.png
mod.png
vip.png
user.png
放到:
/static/image/threadicon/
例如:
/static/image/threadicon/admin.png
/static/image/threadicon/super.png
/static/image/threadicon/mod.png
/static/image/threadicon/vip.png
/static/image/threadicon/user.png
然后模板里面:
<!--{if $thread['my_icon'] == 'admin'}-->
<img class="thread_user_icon" src="$_G['siteurl']static/image/threadicon/admin.png" title="管理员">
<!--{elseif $thread['my_icon'] == 'super'}-->
<img class="thread_user_icon" src="$_G['siteurl']static/image/threadicon/super.png" title="超级版主">
<!--{elseif $thread['my_icon'] == 'mod'}-->
<img class="thread_user_icon" src="$_G['siteurl']static/image/threadicon/mod.png" title="版主">
<!--{elseif $thread['my_icon'] == 'vip'}-->
<img class="thread_user_icon" src="$_G['siteurl']static/image/threadicon/vip.png" title="VIP会员">
<!--{else}-->
<img class="thread_user_icon" src="$_G['siteurl']static/image/threadicon/user.png" title="普通会员">
<!--{/if}-->
CSS:
.thread_user_icon {
width: 18px;
height: 18px;
margin-left: 5px;
vertical-align: -4px;
border: 0;
}
最终:
这是一个非常好的经验分享 🔵
或者:
这个方法真的很好用 👑
十四、其实我更推荐“CSS图标”,不用图片
如果你的目标就是截图中的这种小标签:
New
🔥
VIP
荐
置顶
官方
完全没有必要制作图片。
例如:
<span class="thread_badge thread_badge_vip">VIP</span>
CSS:
.thread_badge {
display: inline-block;
height: 18px;
line-height: 18px;
padding: 0 5px;
margin-left: 6px;
border-radius: 4px;
font-size: 11px;
font-weight: normal;
color: #fff;
vertical-align: middle;
}
.thread_badge_admin {
background: #e53935;
}
.thread_badge_mod {
background: #ff9800;
}
.thread_badge_vip {
background: #9c27b0;
}
.thread_badge_user {
background: #607d8b;
}
这样甚至可以做出非常漂亮的效果。
十五、还可以做成“图标 + 用户组名称”
例如:
🔴 管理员
🟠 版主
🟣 VIP
🔵 会员
HTML:
<span class="thread_badge thread_badge_admin">管理员</span>
或者:
<span class="thread_badge thread_badge_vip">VIP</span>
用户一眼就知道:
这个帖子是谁发的。
十六、还可以按照“指定用户”显示
这个其实对论坛特别实用。
比如:
UID 1 → 官方
UID 2 → 官方
UID 10 → 精品作者
UID 35 → 技术大神
比如:
$authorid = intval($thread['authorid']);
if(in_array($authorid, array(1, 2))) {
$threadlist[$key]['my_icon'] = 'official';
} elseif(in_array($authorid, array(10, 35, 88))) {
$threadlist[$key]['my_icon'] = 'expert';
} else {
$threadlist[$key]['my_icon'] = 'user';
}
这样可以做到:
官方发布:某某公告 [官方]
大神发布:某个技术教程 [大神]
普通用户:求助一个问题
这比按照用户组更加灵活。
十七、我其实更建议你做成“三层判断”
最终可以设计成:
第一优先级:指定用户
↓
第二优先级:用户组
↓
第三优先级:普通用户
例如:
if(in_array($authorid, array(1, 2))) {
$threadlist[$key]['my_icon'] = 'official';
} elseif(in_array($groupid, array(2, 3))) {
$threadlist[$key]['my_icon'] = 'mod';
} elseif($groupid == 20) {
$threadlist[$key]['my_icon'] = 'vip';
} else {
$threadlist[$key]['my_icon'] = 'user';
}
这样以后非常容易扩展。
十八、还有一种方法非常适合你的截图:按照“主题分类”显示
你截图里面其实已经有:
[经验]
[杂谈]
[分享]
推荐
如果你的目的实际上是:
看到标题旁边的标志,就知道“这个帖子是什么类型”
那么主题分类比用户组更加合适。
例如:
经验 → 🟢
杂谈 → 🔵
教程 → 🟣
资源 → 🟠
公告 → 🔴
这样:
[经验] 小米笔记本掉网卡解决了 🟢
[分享] 找到了一个很好用的软件 🔵
[教程] Debian配置教程 🟣
这个实现甚至不需要查用户数据库。
十九、主题分类的实现方式
Discuz 帖子列表中已经有:
$thread['typeid']
你可以根据:
$thread['typeid']
直接判断。
例如:
switch(intval($thread['typeid'])) {
case 1:
$threadlist[$key]['my_icon'] = 'experience';
break;
case 2:
$threadlist[$key]['my_icon'] = 'chat';
break;
case 3:
$threadlist[$key]['my_icon'] = 'share';
break;
default:
$threadlist[$key]['my_icon'] = '';
}
模板:
<!--{if $thread['my_icon'] == 'experience'}-->
<span class="thread_badge thread_badge_experience">经验</span>
<!--{elseif $thread['my_icon'] == 'chat'}-->
<span class="thread_badge thread_badge_chat">杂谈</span>
<!--{elseif $thread['my_icon'] == 'share'}-->
<span class="thread_badge thread_badge_share">分享</span>
<!--{/if}-->
这就非常接近你截图的效果。
二十、甚至可以做成你截图一样的“🔥 New”效果
例如:
<span class="fire_badge">
<span class="fire_icon">🔥</span>
New
</span>
CSS:
.fire_badge {
display: inline-flex;
align-items: center;
height: 20px;
margin-left: 6px;
padding: 0 5px;
border-radius: 3px;
font-size: 12px;
color: #fff;
background: #ff9800;
}
.fire_icon {
margin-right: 2px;
font-size: 13px;
}
效果类似:
这是一个热门帖子 🔥 New
二十一、还有一个非常重要的问题:缓存
Discuz 修改模板以后,经常会出现:
明明改好了,但是网页没有变化。
这不是代码没生效。
因为 Discuz 有模板缓存。
修改之后进入:
管理中心
→ 工具
→ 更新缓存
然后:
模板缓存
重新更新。
如果用了 CDN,例如 Cloudflare,还要注意 CDN 缓存。
二十二、我建议你不要直接大量修改 Discuz 核心文件
如果这个功能最终是长期使用,我推荐:
论坛帖子数据
↓
增加一个 icon 标识
↓
模板显示
↓
CSS负责样式
而不是:
在 forumdisplay_list.htm
疯狂写数据库查询
前一种结构以后维护非常方便。
二十三、我给你推荐最终方案
按照你截图中的论坛,我会设计成下面这种:
管理员
这是论坛官方公告 [官方]
版主
这是版主发布的教程 [版主]
VIP
这是VIP用户分享 [VIP]
精品作者
这是大神的技术文章 [大神]
普通会员
不显示任何东西:
这是普通用户的帖子
或者:
这是普通用户的帖子 [会员]
同时,再根据主题分类决定第二个标签:
[经验] 小米笔记本掉网卡解决了 [大神]
[杂谈] 某某问题 [VIP]
[分享] 推荐一个非常好用的软件 [会员]
这就会变成非常专业的论坛视觉体系。
二十四、最重要的一点:你现在不要直接照着上面的 PHP 位置乱改
因为 Discuz X3.5 不同版本、不同模板、以及你论坛现在已经改过的模板,forumdisplay_list.htm 和 forumdisplay.php 具体代码位置可能不同。
而且你之前已经对 Discuz X3.5 的 Markdown、伪静态等代码做过修改,我更建议直接基于你现在正在运行的文件来改,避免把你之前的修改覆盖掉。
把你目前使用的:
/source/module/forum/forumdisplay.php
以及:
/template/你当前模板/forum/forumdisplay_list.htm
发给我,我可以直接根据你现在这套 Discuz X3.5 的实际代码结构,给你做成一套可以直接复制进去的版本,包括:
① 按用户组显示图标
② 按指定 UID 显示图标
③ 按主题分类显示图标
④ 图标 CSS
⑤ 图片图标版本
⑥ 移动端适配
⑦ 不增加 N+1 数据库查询
⑧ Discuz 缓存处理
上传DiscuzX3.5的源代码后给的解决方案:
对,这个就非常好了。你上传的是 Discuz_X3.5_SC_UTF8_20260504.zip,也就是你所说的官方 X3.5 代码包。
我已经直接检查了里面的实际源码,不再按照“可能是这个文件、可能是那个版本”来猜。并且我确认了一件很重要的事情:
你截图里的 New,在官方 X3.5 代码里本来就有对应的完整实现。
也就是说,我们完全可以沿用 Discuz 自己的实现方式,做一个“用户组/用户类型徽章系统”,而且可以做到不增加每个帖子一次数据库查询。
一、先把你截图中的 New 找出来
你截图里:
某个帖子标题 New
并不是第三方插件做的。
在你这份官方 X3.5 的:
upload/template/default/forum/forumdisplay_list.htm
里,我找到了:
<!--{if $thread['weeknew']}-->
<a href="forum.php?mod=redirect&tid=$thread[tid]&goto=lastpost#lastpost" class="xi1">New</a>
<!--{/if}-->
而 weeknew 是在:
upload/source/module/forum/forum_forumdisplay.php
里计算出来的。
核心逻辑是:
$thread['weeknew'] = TIMESTAMP - 604800 <= $thread['dateline'];
也就是大致判断:
帖子是不是最近 7 天发布的。
另外,如果用户访问过论坛,Discuz 还会根据最后访问时间进一步把帖子标成 new。
所以你截图中的 New,本质上就是:
PHP给帖子增加一个标识
↓
模板检测这个标识
↓
输出一个小标签
我们自己的徽章系统完全可以照这个思路做。
二、你这套官方代码里,其实已经给我们准备好了一个非常好的“入口”
你的官方:
source/module/forum/forum_forumdisplay.php
在处理帖子列表的时候,有这一段:
if($authorids) {
loadcache('usergroups');
$groupcolor = array();
foreach(C::t('common_member')->fetch_all($authorids) as $value) {
$groupcolor[$value['uid']] = $_G['cache']['usergroups'][$value['groupid']]['color'];
}
}
这一段特别重要。
因为 Discuz 本来就会把当前帖子列表涉及到的作者 UID 一次性拿出来,然后批量读取会员信息。
也就是说:
假设当前页面 50 个帖子:
帖子1 → UID 100
帖子2 → UID 205
帖子3 → UID 302
...
帖子50 → UID 888
Discuz 并不是:
查 UID100
查 UID205
查 UID302
...
而是:
C::t('common_member')->fetch_all($authorids)
批量查询。
所以我们可以直接利用这个现成的数据。
这样就不会因为你增加徽章功能而出现 50 个帖子额外查询 50 次数据库的问题。
这个实现方式我比较推荐。
三、我们最终可以做到什么
比如你的论坛以后可以显示成:
小米笔记本掉网卡解决了 [经验] [大神]
推荐一个很好用的开源工具 [分享] [VIP]
论坛规则更新 [公告] [官方]
Debian系统配置教程 [教程] [版主]
普通用户:
请教一下NAS的问题
甚至普通用户什么标签都不显示。
四、先确定我们到底要区分什么
你最初说的是:
“区分不同用户组或者用户发帖的区别,让人看到标题旁的那个图标就能知道是什么类型的帖子。”
所以我建议你把系统设计成两层:
第一层:用户身份徽章
比如:
官方
版主
VIP
大神
认证作者
普通会员
第二层:帖子类型
比如:
经验
杂谈
分享
教程
资源
公告
这样最终可以变成:
小米笔记本掉网卡解决了 [经验] [大神]
而不是仅仅:
小米笔记本掉网卡解决了 [大神]
这个效果会比单纯按用户组区分专业很多。
五、还有一个非常关键的发现:你的 Discuz 原生已经支持“主题分类图标”
在 forum_forumdisplay.php 这份官方代码里,我还找到了:
if($thread['typeid'] && !empty($_G['forum']['threadtypes']['prefix']) && isset($_G['forum']['threadtypes']['types'][$thread['typeid']])) {
然后:
if($_G['forum']['threadtypes']['prefix'] == 1) {
...
} elseif($_G['forum']['threadtypes']['icons'][$thread['typeid']] && $_G['forum']['threadtypes']['prefix'] == 2) {
$thread['typehtml'] = ...
}
这意味着 Discuz X3.5 原生就支持主题分类图标。
也就是说你截图中的:
[经验]
[杂谈]
[分享]
本来就和:
$thread['typehtml']
有关。
你模板中也确实有:
$thread[typehtml] $thread[sorthtml]
所以这里我非常建议:
不要重复发明一个“帖子类型系统”。
Discuz 自己的:
主题分类
直接拿来用。
我们只增加:
用户组徽章
即可。
六、因此,我建议你的最终结构是
Discuz 原生主题分类
+
自定义用户组徽章
+
可选指定 UID 徽章
例如:
[经验] 小米笔记本掉网卡解决了 🔥大神
[分享] 一个很好用的开源工具 💎VIP
[杂谈] 最近的一些想法 👤
[公告] 论坛规则调整 👑官方
七、现在开始正式修改
第一处:修改 PHP
文件:
/source/module/forum/forum_forumdisplay.php
你上传的官方源码中,原本大约是下面这段:
if($authorids) {
loadcache('usergroups');
$groupcolor = array();
foreach(C::t('common_member')->fetch_all($authorids) as $value) {
$groupcolor[$value['uid']] = $_G['cache']['usergroups'][$value['groupid']]['color'];
}
}
把这一段替换成下面的版本:
if($authorids) {
loadcache('usergroups');
$groupcolor = array();
$authorgroupid = array();
$authoradminid = array();
foreach(C::t('common_member')->fetch_all($authorids) as $value) {
$uid = intval($value['uid']);
$groupid = intval($value['groupid']);
$adminid = intval($value['adminid']);
// 保留 Discuz 原有的用户名颜色功能
$groupcolor[$uid] = isset($_G['cache']['usergroups'][$groupid]['color'])
? $_G['cache']['usergroups'][$groupid]['color']
: '';
// 保存作者用户组
$authorgroupid[$uid] = $groupid;
// 保存作者管理身份
$authoradminid[$uid] = $adminid;
}
/*
* 给帖子增加自定义徽章
*/
foreach($_G['forum_threadlist'] as $key => $thread) {
$uid = intval($thread['authorid']);
$groupid = isset($authorgroupid[$uid])
? $authorgroupid[$uid]
: 0;
$adminid = isset($authoradminid[$uid])
? $authoradminid[$uid]
: 0;
/*
* 默认不显示
*/
$_G['forum_threadlist'][$key]['custom_badge'] = '';
/*
* ==================================================
* 1. 指定 UID 优先
* ==================================================
*
* 例如 UID 1、2 是官方账号
*/
if(in_array($uid, array(1, 2))) {
$_G['forum_threadlist'][$key]['custom_badge'] = 'official';
/*
* ==================================================
* 2. 管理员身份
* ==================================================
*/
} elseif($adminid == 1) {
$_G['forum_threadlist'][$key]['custom_badge'] = 'admin';
/*
* ==================================================
* 3. 超级版主
* ==================================================
*
* 这里的 groupid 请按照你论坛实际用户组修改
*/
} elseif($groupid == 2) {
$_G['forum_threadlist'][$key]['custom_badge'] = 'supermoderator';
/*
* ==================================================
* 4. 版主
* ==================================================
*/
} elseif($groupid == 3) {
$_G['forum_threadlist'][$key]['custom_badge'] = 'moderator';
/*
* ==================================================
* 5. VIP
* ==================================================
*
* 假设 VIP 用户组 ID = 20
*/
} elseif($groupid == 20) {
$_G['forum_threadlist'][$key]['custom_badge'] = 'vip';
/*
* ==================================================
* 6. 普通用户
* ==================================================
*/
} else {
$_G['forum_threadlist'][$key]['custom_badge'] = '';
}
}
}
八、这里你必须改的只有几个数字
例如:
array(1, 2)
表示:
UID 1
UID 2
属于官方账号。
然后:
$groupid == 2
表示:
用户组 ID 2 = 超级版主
然后:
$groupid == 3
表示:
用户组 ID 3 = 版主
然后:
$groupid == 20
表示:
用户组 ID 20 = VIP
这些数字只是示范。
你论坛实际的用户组 ID,必须按照你后台为准。
九、为什么我没有让你每个帖子查询一次用户组?
这是这次修改最重要的一点。
错误做法是:
foreach($threadlist as $thread) {
$member = C::t('common_member')->fetch($thread['authorid']);
}
这样 50 帖:
50次数据库查询
而你官方 Discuz 已经存在:
C::t('common_member')->fetch_all($authorids)
我们直接利用:
$value['groupid']
$value['adminid']
即可。
所以:
原来的批量查询
↓
顺便取得 groupid
↓
给 thread 增加 custom_badge
性能上合理得多。
十、第二处:修改帖子列表模板
文件:
/template/default/forum/forumdisplay_list.htm
你这份官方模板中真正显示标题的位置,我已经找到:
<a href="forum.php?mod=viewthread&tid=$thread[tid]..."
class="s xst">$thread[subject]</a>
在它后面,你已经有很多官方标签:
隐藏
印章
抢楼
附件
手机
精华
推荐
New
来自哪个群组
所以我们的徽章应该放在:
标题
→ 自定义徽章
→ 原来的 New
这样最自然。
十一、找到这段
你官方模板里面有:
<!--{if $thread['weeknew']}-->
<a href="forum.php?mod=redirect&tid=$thread[tid]&goto=lastpost#lastpost" class="xi1">New</a>
<!--{/if}-->
就在它前面加入:
<!--{if $thread['custom_badge'] == 'official'}-->
<span class="custom-thread-badge badge-official">官方</span>
<!--{elseif $thread['custom_badge'] == 'admin'}-->
<span class="custom-thread-badge badge-admin">管理员</span>
<!--{elseif $thread['custom_badge'] == 'supermoderator'}-->
<span class="custom-thread-badge badge-supermoderator">超版</span>
<!--{elseif $thread['custom_badge'] == 'moderator'}-->
<span class="custom-thread-badge badge-moderator">版主</span>
<!--{elseif $thread['custom_badge'] == 'vip'}-->
<span class="custom-thread-badge badge-vip">VIP</span>
<!--{/if}-->
这样:
帖子标题 [VIP] New
或者:
帖子标题 [官方]
十二、第三处:CSS
你可以先把 CSS 放进:
/template/default/common/common.css
加入:
.custom-thread-badge {
display: inline-block;
margin-left: 6px;
padding: 0 5px;
height: 18px;
line-height: 18px;
border-radius: 3px;
font-size: 11px;
font-weight: normal;
vertical-align: middle;
color: #fff;
white-space: nowrap;
}
.badge-official {
background: #f44336;
}
.badge-admin {
background: #e53935;
}
.badge-supermoderator {
background: #ff9800;
}
.badge-moderator {
background: #2196f3;
}
.badge-vip {
background: #9c27b0;
}
此时效果大概就是:
小米笔记本掉网卡解决了 VIP
十三、我更推荐你把它做成“真正的图标”
如果你不想要:
VIP
版主
官方
而希望类似你截图中:
🔥
💎
👑
或者更专业的:
[皇冠图标]
[VIP图标]
[官方认证图标]
那么完全可以把:
<span class="custom-thread-badge badge-vip">VIP</span>
改成图片:
<img src="{IMGDIR}/custom/vip.png"
class="custom-thread-icon"
title="VIP会员"
alt="VIP会员" />
CSS:
.custom-thread-icon {
width: 18px;
height: 18px;
margin-left: 5px;
vertical-align: -4px;
border: 0;
}
比如:
/static/image/common/vip.png
/static/image/common/mod.png
/static/image/common/official.png
这样更接近你截图的感觉。
十四、但是还有一个问题必须处理:图片模式
你上传的官方 forumdisplay_list.htm 不是只有一种列表。
我检查到了它实际上有两个帖子列表分支:
普通列表
也就是你截图这种:
图标 | 标题 | 作者 | 回复 | 最后发表
图片瀑布流
也就是:
图片
标题
官方代码里面图片模式下也有一个:
$thread[subject]
所以:
如果你的论坛允许切换“图片模式”,那么也应该在那里加入徽章。
十五、你这份官方模板第二个标题位置
你的官方源码中另一个标题大约是:
<a href="forum.php?mod=viewthread&tid=$thread[tid]..."
title="$thread[subject]">$thread[subject]</a>
也是:
$thread[subject]
在这里后面同样添加:
<!--{if $thread['custom_badge'] == 'official'}-->
<span class="custom-thread-badge badge-official">官方</span>
<!--{elseif $thread['custom_badge'] == 'admin'}-->
<span class="custom-thread-badge badge-admin">管理员</span>
<!--{elseif $thread['custom_badge'] == 'supermoderator'}-->
<span class="custom-thread-badge badge-supermoderator">超版</span>
<!--{elseif $thread['custom_badge'] == 'moderator'}-->
<span class="custom-thread-badge badge-moderator">版主</span>
<!--{elseif $thread['custom_badge'] == 'vip'}-->
<span class="custom-thread-badge badge-vip">VIP</span>
<!--{/if}-->
这样两种模式都有。
十六、实际上,我们还可以进一步升级
我建议不要把最终系统写死成:
if($groupid == 20)
而是最终做成一个统一配置。
比如:
$custom_badge_groups = array(
20 => array(
'class' => 'badge-vip',
'name' => 'VIP'
),
21 => array(
'class' => 'badge-author',
'name' => '作者'
),
22 => array(
'class' => 'badge-expert',
'name' => '大神'
),
23 => array(
'class' => 'badge-mod',
'name' => '版主'
),
);
这样以后你只改:
20 → VIP
21 → 作者
22 → 大神
23 → 版主
不用再改逻辑。
十七、甚至可以做到“指定用户优先级”
我特别建议你做这一层。
比如:
UID 1 → 官方
UID 2 → 官方
UID 10 → 技术大神
UID 15 → 金牌作者
即使这些用户属于普通用户组:
普通会员
他们仍然可以显示:
官方
大神
作者
优先级可以设计为:
指定 UID
↓
管理员
↓
超级版主
↓
版主
↓
VIP
↓
普通会员
这个非常灵活。
十八、还可以自动根据用户组显示不同颜色
你的官方代码本身就已经在使用:
$groupcolor[$thread[authorid]]
所以作者名称本身已经可以根据用户组颜色显示。
例如:
管理员用户名
颜色是红色。
与此同时标题后:
[官方]
也是红色。
整个论坛的视觉一致性会很好。
十九、我特别建议你不要修改数据库
这个功能:
完全不需要增加字段。
不要给:
forum_thread
增加:
badge
type
icon
之类的字段。
因为“帖子属于哪个用户组”本质上是:
thread.authorid
↓
common_member.uid
↓
common_member.groupid
动态计算就可以。
这样以后修改用户组:
用户从 VIP → 普通会员
帖子的徽章也自动变化。
二十、还有一个非常漂亮的玩法
你截图中的:
[经验]
[杂谈]
[分享]
本身就是 Discuz 的:
$thread[typehtml]
我们可以保留:
[经验]
然后增加:
[大神]
于是:
[经验] 小米笔记本掉网卡解决了 [大神]
这非常符合你最开始说的:
“看到标题旁的那个图标就能知道是什么类型的帖子。”
因为现在:
[经验] = 帖子类型
[大神] = 作者身份
New = 时间状态
三个信息互不冲突。
二十一、甚至可以进一步设计成
[经验] 小米笔记本掉网卡解决了 🔥 New
[分享] 找到一个很好用的软件 💎 VIP
[教程] Debian安装教程 👑 官方
[杂谈] 最近的一些想法 🔵
这就已经很接近一个成熟社区的视觉体系了。
二十二、缓存一定要注意
改完:
forum_forumdisplay.php
forumdisplay_list.htm
common.css
之后,Discuz 不一定立即看到效果。
进入:
管理中心
→ 工具
→ 更新缓存
至少更新:
模板缓存
数据缓存
如果前面有 Cloudflare / CDN,还要考虑 CDN 缓存。
二十三、还有一个更重要的事情:你的官方模板文件路径
从你这个官方包来看,我们确定是:
upload/source/module/forum/forum_forumdisplay.php
以及:
upload/template/default/forum/forumdisplay_list.htm
所以如果你网站安装目录就是 Discuz 根目录,那么对应实际位置就是:
/source/module/forum/forum_forumdisplay.php
/template/default/forum/forumdisplay_list.htm
而不是:
/source/module/forum/forumdisplay.php
这一点之前我给你的泛化路径需要纠正。
X3.5 这里实际文件就是 forum_forumdisplay.php。
二十四、我建议你下一步不要自己一点一点照着复制
因为你现在已经把完整官方源代码给我了,我可以直接按照这一版源码来给你整理成一套完整方案。
而且我已经检查到:
forum_forumdisplay.php
forumdisplay_list.htm
common_member
threadtype
typehtml
weeknew
groupcolor
这些关键位置都已经明确。
最稳妥的下一步是,我直接基于你上传的 2026-05-04 官方 X3.5 源码,给你做一个:
“Discuz X3.5 帖子标题用户组徽章增强版”
最终包含:
管理员 → 👑 官方
超级版主 → 🛡 超版
版主 → 🔨 版主
VIP → 💎 VIP
指定 UID → ⭐ 大神
普通会员 → 不显示
同时:
[经验] → Discuz 原生主题分类
[大神] → 自定义作者徽章
New → Discuz 原生 New
而且不新增数据库字段、不对每个帖子单独查询数据库、同时兼容普通列表和图片模式。