问题核心分析:为什么主页不显示?
在动手之前,我们先理解一下原因,这样能更快定位问题:

- 权限问题 (最常见):Discuz! 的精华帖数据表 (
pre_forum_thread) 中,有一个字段displayorder。displayorder = 0是普通帖子,displayorder > 0是精华帖,但Discuz! 还有一个isgroup字段,如果你的论坛有“小组”功能,小组内的精华帖isgroup可能不为0,DedeCMS默认调用时,可能没有正确处理这些分组或权限,导致查询结果为空。 - 数据范围问题:你可能在调用时,无意中加上了某些限制条件,比如只调用某个特定版块的精华帖,而主页所在的栏目下没有符合条件的帖子。
- 缓存问题:DedeCMS有强大的缓存机制,有时候你修改了代码,但页面没有更新,导致还是显示旧的结果(空白)。
- PHP版本/环境问题:如果你的PHP版本较低,可能不支持
JOIN等较为复杂的SQL查询语法。
解决方案
使用DedeCMS自带的“数据调用”标签(推荐新手)
这是最简单、最安全的方法,不需要写复杂的SQL语句。
-
进入后台:登录你的DedeCMS后台。
-
找到数据调用:在左侧菜单栏找到
核心->数据调用。 -
新建调用:
(图片来源网络,侵删)- 名称:随便起一个,调用DZ精华帖”。
- 按SQL语句查询:选择这个选项。
- SQL语句:这是关键,复制并粘贴下面的代码:
SELECT tid, subject, fid, author, postdatetime FROM dede_forum_thread WHERE displayorder > 0 ORDER BY dateline DESC LIMIT 0, 10
- 字段说明:
tid: 帖子ID。subject: 帖子标题。fid: 版块ID,如果你想指定版块,可以加上AND fid = '你的版块ID'。author: 作者。postdatetime: 发布时间。displayorder > 0: 精华帖的核心筛选条件,表示只调用精华帖。ORDER BY dateline DESC: 按发布时间倒序排列,最新的在前。LIMIT 0, 10: 从第0条开始,获取10条,你可以修改数字来调整显示数量。
- 模板:填写调用后显示的HTML代码。
[field:subject/]
- 缓存:可以设置一个缓存时间,
3600(1小时)。
-
保存:点击“新增”或“保存”按钮。
-
在前台使用:现在你可以在任何DedeCMS的模板文件(如
index.htm)中使用这个标签:{dede:loop table='dede_forum_thread' sort='dateline' row='10' if='displayorder>0'} <a href="/bbs/viewthread.php?tid=[field:tid/]">[field:subject/]</a> {/dede:loop}注意:这里的
{dede:loop}标签是直接使用你刚才在后台设置的SQL,你也可以直接在模板里写完整的SQL,但后台管理更方便。
手动编写SQL(更灵活)
如果你对SQL比较熟悉,可以直接在模板文件里写。
-
打开模板文件:用FTP或后台编辑器打开你想要显示精华帖的模板文件,
index.htm。 -
插入代码:在合适的位置插入以下代码:
<h3>论坛精华帖</h3> <ul> {dede:sql sql="SELECT tid, subject, fid, author FROM dede_forum_thread WHERE displayorder > 0 ORDER BY dateline DESC LIMIT 0,10"} <li> <a href="/bbs/viewthread.php?tid=[field:tid/]" target="_blank">[field:subject/]</a> <span class="author">- [field:author/]</span> </li> {/dede:sql} </ul> -
代码解释:
{dede:sql ...}:DedeCMS执行自定义SQL的标签。sql="...":里面是完整的SQL查询语句。[field:tid/],[field:subject/]:循环输出查询结果的每个字段。/bbs/viewthread.php?tid=:请务必修改成你的Discuz!论坛的帖子链接地址,默认是/bbs/,如果你的不是,请相应修改。
-
保存并更新:保存文件,然后到DedeCMS后台的“主页” -> “更新主页”,生成新的HTML页面。
使用“runphp”进行更复杂的逻辑处理(高级)
如果你的需求更复杂,比如需要同时获取版块名称,或者进行权限判断,可以使用runphp。
<h3>论坛精华帖</h3>
<ul>
{dede:sql sql="SELECT t.tid, t.subject, t.author, t.dateline, f.name as forumname FROM dede_forum_thread t LEFT JOIN dede_forum_forum f ON t.fid = f.fid WHERE t.displayorder > 0 ORDER BY t.dateline DESC LIMIT 0,10"}
<li>
<a href="/bbs/viewthread.php?tid=[field:tid/]" target="_blank">[field:subject/]</a>
<span class="info">
([field:forumname/]) - [field:author/] 于 [field:function="MyDate('Y-m-d', @me)"/]
</span>
</li>
{/dede:sql}
</ul>
这个例子增加了 LEFT JOIN 来关联版块表,并使用 field:function="MyDate(...)" 来格式化时间。
故障排查:如果还是不显示,怎么办?
如果按照上面的方法做了,但页面依然是空白的,请按以下步骤检查:
-
检查表前缀:
- 登录你的Discuz!后台,在“数据库” -> “数据库恢复”页面,可以看到你的表前缀,很可能是
pre_。 - 在你的SQL语句中,表名必须使用这个前缀,
pre_forum_thread,如果你不确定,就去DedeCMS后台的“系统” -> “数据库备份/恢复”里查看你的数据库表名。
- 登录你的Discuz!后台,在“数据库” -> “数据库恢复”页面,可以看到你的表前缀,很可能是
-
检查权限:
- 确保你的DedeCMS连接数据库的账号,有权限读取
pre_forum_thread这张表,99%的情况下是没问题的,但可以确认一下。
- 确保你的DedeCMS连接数据库的账号,有权限读取
-
清除缓存:
进入DedeCMS后台,点击“系统” -> “一键更新网站” -> “更新缓存”,有时候旧的缓存会干扰新数据的显示。
-
简化查询:
- 把你的SQL语句简化到极致,先确保能查出数据。
- 测试SQL:你可以直接在phpMyAdmin(你的数据库管理工具)里运行这个最简单的SQL:
SELECT tid, subject FROM pre_forum_thread LIMIT 10;
如果能查出数据,说明表和连接没问题,如果查不出,说明表名或前缀错了。
- 再加条件:
SELECT tid, subject FROM pre_forum_thread WHERE displayorder > 0 LIMIT 10;
如果这个查询结果为空,说明你的论坛里目前确实没有精华帖(
displayorder都为0),可以去你的Discuz!后台手动加几个精华帖再测试。
-
检查PHP错误:
- 如果你的SQL语法有问题(比如用了不支持的JOIN),PHP可能会报错,但DedeCMS默认不显示错误,你可以临时开启PHP错误显示来排查。
- 在你的模板文件最开头加上:
<?php ini_set('display_errors', 1); error_reporting(E_ALL); ?>这样如果有PHP错误,页面就会直接显示出来,方便你定位问题。
对于大多数用户,方案一(后台数据调用) 是最简单有效的,如果不行,再尝试方案二(直接在模板写SQL),并重点检查 表前缀 和 **SQL查询本身
