找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 31|回复: 0

[维护日志] [2026-07-25] [优化] [首页四格热帖排序] - 解决最新回复与热帖高度重合问题

[复制链接]
  • 打卡等级:本地老炮

9336

威望

6876

金钱

1万

贡献

管理员

自由的灵魂

积分
106811
主题
5597
回帖
26608
注册时间
2003-4-10
最后登录
2026-8-11
发表于 2026-7-25 20:21:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

1、问题缘起

论坛首页四格中的「最新回复」和「热帖」两个栏目,显示的帖子高度重合,几乎一样。初步怀疑是后台“主题热度”阈值设置问题,但调整后未能解决。

经代码排查发现根本原因:
  • fetch_all_for_guide('hot') 虽然筛选了 heats >= 3 的帖子,但排序仍然按 lastpost(最后回复时间)降序排列
  • 与「最新回复」栏目使用完全相同的排序规则,导致两个列表只是同一批帖子的子集关系


需求:热帖应按照热度值(heats)排序,而非最后回复时间,并允许管理员通过后台控制热帖的时间范围。




2、解决方案

(1)简要技术分析

修改 fetch_all_for_guide 函数中 case 'hot' 分支的排序逻辑,从 lastpost 改为 heats 降序;同时新增后台设置项,允许管理员自定义热帖显示的时间范围(单位:天),0 表示不限制。

(2)修改文件列表

操作文件路径
修改/www/wwwroot/www.dianbo.org/source/class/table/table_forum_thread.php
修改/www/wwwroot/www.dianbo.org/source/admincp/admincp_grid.php
修改/www/wwwroot/www.dianbo.org/source/language/lang_admincp.php


(3)关键代码段

A. 排序逻辑修改table_forum_thread.phpfetch_all_for_guide 函数):

  1. public function fetch_all_for_guide($type, $limittid, $tids = array(), $heatslimit = 3, $dateline = 0, $start = 0, $limit = 600, $fids = 0) {
  2.     switch ($type) {
  3.         case 'hot' :
  4.             $addsql = ' AND heats>='.intval($heatslimit);
  5.             // 从后台设置读取时间范围
  6.             $grid_config = C::t('common_setting')->fetch_setting('grid', true);
  7.             $heat_days = isset($grid_config['heat_days']) ? intval($grid_config['heat_days']) : 365;
  8.             if($heat_days > 0) {
  9.                 $addsql .= ' AND dateline > '.(TIMESTAMP - $heat_days * 86400);
  10.             }
  11.             break;
  12.         // ...
  13.     }
  14.     // ...
  15.     if($type == 'newthread') {
  16.         $orderby = 'tid';
  17.     } elseif($type == 'reply') {
  18.         $orderby = 'lastpost';
  19.         $addsql .= ' AND replies > 0';
  20.     } elseif($type == 'hot') {
  21.         $orderby = 'heats';  // 关键:热帖按热度排序
  22.     } else {
  23.         $orderby = 'lastpost';
  24.     }
  25.     // ...
  26. }
复制代码


B. 后台设置项admincp_grid.php):

  1. showsetting('forums_grid_cache_life', 'grid[cachelife]', $grid['cachelife'], 'text');
  2. // ========== 新增:热帖时间范围 ==========
  3. showsetting('forums_grid_heat_days', 'grid[heat_days]', $grid['heat_days'], 'text');
  4. // ========== 新增结束 ==========
  5. showtagfooter('tbody');
复制代码


C. 语言包lang_admincp.php):

  1. 'forums_grid_heat_days' => '热帖时间范围',
  2. 'forums_grid_heat_days_comment' => '设置热帖显示的时间范围(单位:天)。输入 0 表示不限制时间,显示所有热帖。',
复制代码





3、最终实现效果

对比项修改前修改后
热帖排序依据lastpost(最后回复时间)heats(热度值)
热帖与最新回复重合度高度重合完全区分
后台可调时间范围❌ 无✅ 可自定义天数
后台可控制是否限制时间❌ 无✅ 输入 0 不限制
配置方式后台 → 论坛 → 首页四格





4、重要技术沉淀

踩坑点

踩坑正确做法
误以为是后台“主题热度”阈值问题实际是 fetch_all_for_guidehot 分支未单独指定排序字段
硬编码 365 天限制改为从后台 grid['heat_days'] 读取,灵活可控
后台设置项风格不一致导致显示异常模仿原有 text 类型,保持风格统一


无需更新固化摘要(属于后台功能优化,非核心架构变更)。




5、进一步优化可能性

  • 热帖列表可增加“参与人数”或“回复数”等辅助信息显示
  • 热帖时间范围可改为下拉选择(30/90/180/365/0),提升用户体验
  • 可考虑增加“热帖最小热度值”的后台配置项(当前硬编码为 3)

不懂就搜!点此搜点拨论坛。如果本坛没有,请尝试点此问AI,或跟帖提问。
发帖前注意看置顶帖
不定期借助AI对点拨论坛陈年老帖进行挖坟回复,打扰勿怪!
要养成随时修正错别字的好习惯!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|点拨论坛 |网站地图|网站地图

GMT+8, 2026-8-11 22:34 , Processed in 0.065429 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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