活力39167
在线时间13434 小时
阅读权限200
管理员
自由的灵魂
- 积分
- 106811
- 主题
- 5597
- 回帖
- 26608
- 注册时间
- 2003-4-10
- 最后登录
- 2026-8-11
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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.php,fetch_all_for_guide 函数):
- public function fetch_all_for_guide($type, $limittid, $tids = array(), $heatslimit = 3, $dateline = 0, $start = 0, $limit = 600, $fids = 0) {
- switch ($type) {
- case 'hot' :
- $addsql = ' AND heats>='.intval($heatslimit);
- // 从后台设置读取时间范围
- $grid_config = C::t('common_setting')->fetch_setting('grid', true);
- $heat_days = isset($grid_config['heat_days']) ? intval($grid_config['heat_days']) : 365;
- if($heat_days > 0) {
- $addsql .= ' AND dateline > '.(TIMESTAMP - $heat_days * 86400);
- }
- break;
- // ...
- }
- // ...
- if($type == 'newthread') {
- $orderby = 'tid';
- } elseif($type == 'reply') {
- $orderby = 'lastpost';
- $addsql .= ' AND replies > 0';
- } elseif($type == 'hot') {
- $orderby = 'heats'; // 关键:热帖按热度排序
- } else {
- $orderby = 'lastpost';
- }
- // ...
- }
复制代码
B. 后台设置项(admincp_grid.php):
- showsetting('forums_grid_cache_life', 'grid[cachelife]', $grid['cachelife'], 'text');
- // ========== 新增:热帖时间范围 ==========
- showsetting('forums_grid_heat_days', 'grid[heat_days]', $grid['heat_days'], 'text');
- // ========== 新增结束 ==========
- showtagfooter('tbody');
复制代码
C. 语言包(lang_admincp.php):
- 'forums_grid_heat_days' => '热帖时间范围',
- 'forums_grid_heat_days_comment' => '设置热帖显示的时间范围(单位:天)。输入 0 表示不限制时间,显示所有热帖。',
复制代码
3、最终实现效果
| 对比项 | 修改前 | 修改后 | | 热帖排序依据 | lastpost(最后回复时间) | heats(热度值) | | 热帖与最新回复重合度 | 高度重合 | 完全区分 | | 后台可调时间范围 | ❌ 无 | ✅ 可自定义天数 | | 后台可控制是否限制时间 | ❌ 无 | ✅ 输入 0 不限制 | | 配置方式 | 无 | 后台 → 论坛 → 首页四格 |
4、重要技术沉淀
踩坑点:
| 踩坑 | 正确做法 | | 误以为是后台“主题热度”阈值问题 | 实际是 fetch_all_for_guide 中 hot 分支未单独指定排序字段 | | 硬编码 365 天限制 | 改为从后台 grid['heat_days'] 读取,灵活可控 | | 后台设置项风格不一致导致显示异常 | 模仿原有 text 类型,保持风格统一 |
无需更新固化摘要(属于后台功能优化,非核心架构变更)。
5、进一步优化可能性
- 热帖列表可增加“参与人数”或“回复数”等辅助信息显示
- 热帖时间范围可改为下拉选择(30/90/180/365/0),提升用户体验
- 可考虑增加“热帖最小热度值”的后台配置项(当前硬编码为 3)
|
|