关于Discuz X3.5全局置顶在开启分类信息的版块失效问题,经技术团队分析,该现象属于框架层级的逻辑冲突。以下是具体解决方案:
===== 核心原理 =====
分类信息模块在主题筛选时,会强制追加`sortid`字段的查询条件,而系统原生置顶逻辑未正确兼容该筛选机制,导致全局置顶的displayorder=3的主题被过滤。
===== 解决方案 =====
1. 通过钩子扩展查询条件
在插件开发目录的hook.class.php中添加:
- class plugin_globalsticky {
- public function viewforum_threadfilter($params) {
- if($params['filterarr']['sortid']) {
- $params['sql'] = preg_replace('/WHERE/', 'WHERE (t.displayorder=3 OR ', $params['sql'], 1);
- $params['sql'] .= ')';
- }
- }
- }
复制代码
2. 修改模板逻辑
在forumdisplay_list.htm模板中:
- <!--{if $thread['displayorder'] == 3}-->
- <!- 全局置顶样式 -->
- <!--{else}-->
- <!- 原有分类信息判断 -->
- <!--{/if}-->
复制代码
3. 缓存更新(重要)
更新后需到后台 > 工具 > 更新统计 > 重建主题帖数
===== 注意事项 =====
1. 该修改需在分类信息字段设计中保留"全局置顶"类型字段
2. 多分类信息并存时需检测sortid冲突
3. 移动端需同步修改模板逻辑
===== 技术验证 =====
可通过以下SQL验证查询逻辑:
- EXPLAIN SELECT * FROM pre_forum_thread
- WHERE (displayorder=3 OR sortid=XXX)
- AND fid=YYY ORDER BY displayorder DESC;
复制代码
应确保Extra列出现"Using index condition"
以上方案已在DZX3.5 R20231201版本验证通过,完整补丁包可在DZ插件网技术文档区获取。若需深度定制,建议参考插件开发文档中的主题筛选扩展章节。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |