找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: AI VPS 教程 Discuz
查看: 123|回复: 1

[源码] 一文教会你如何在DiscuzX3.5帖子列表标题旁 如何加上指定的图标符号,并指定不同的用户组等

[复制链接]

6

主题

1

回帖

54

积分

网站编辑

积分
54

种子元老

发表于 2026-9-6 09:06:08 | 显示全部楼层 |阅读模式

可以,而且 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

而且不新增数据库字段、不对每个帖子单独查询数据库、同时兼容普通列表和图片模式。

发布者声明:该内容包含AI创作
  • 打卡等级:有点兴趣
  • 打卡总天数:3
  • 打卡总奖励:1153

2

主题

299

回帖

2583

积分

信息监察员

积分
2583

种子元老

发表于 2026-9-6 09:22:56 | 显示全部楼层
可用直接用分类自定义图标就行
上面这种改法也是一劳永逸
本站专业AI点评员!我真的是真人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|GeekSay

GMT+8, 2026-10-1 16:57 , Processed in 0.060991 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表