使用官方标签 {dede:field} + arcatt
这是最简单、最官方的方法,适用于大多数情况,它依赖于文章的 arctitle 或 flag 属性来标记“有评论”。

原理:
DedeCMS在后台发布文章时,有一个“自定义属性”选项,有评论”这个选项被选中后,系统会在文章的 flag 字段中存入一个字母 c,我们只需要判断 flag 字段中是否包含 c 即可。
操作步骤:
-
修改文章模型(可选但推荐): 为了方便管理,建议你在后台的“核心” -> “内容模型管理”中,为你所使用的文章模型添加一个自定义字段,
is_comment,类型为“是/否”,在发布文章时手动勾选,这样逻辑更清晰,但如果不修改,直接使用flag字段也是可以的。 -
在首页模板中添加代码: 登录你的DedeCMS后台,进入“模板” -> “默认模板管理”,找到并编辑你正在使用的首页模板文件(通常是
index.htm)。
(图片来源网络,侵删) -
定位到需要显示评论数的位置: 在文章列表循环
{dede:arclist}内部,找到你想显示评论数的地方,比如文章标题后面。 -
插入判断代码: 将以下代码复制并粘贴到指定位置。
{dede:arclist typeid='' row='10' titlelen='50'} <li> <a href="[field:arcurl/]">[field:title/]</a> <!-- 在这里添加评论数判断代码 --> [field:flag runphp='yes'] $flag = @me; if(strpos($flag, 'c') !== false) { @me = " (有评论)"; } else { @me = " (暂无评论)"; } [/field:flag] </li> {/dede:arclist}
代码解释:
[field:flag runphp='yes']:获取当前文章的flag字段值,并开启PHP运行。$flag = @me;:将flag的值赋给变量$flag。if(strpos($flag, 'c') !== false):判断$flag字符串中是否包含字母c。strpos函数如果找到子字符串则返回其位置(一个数字),否则返回false,我们使用!== false来确保严格判断。@me = " (有评论)";:如果包含c,则输出“ (有评论)”。@me = " (暂无评论)";:如果不包含c,则输出“ (暂无评论)”。[/field:flag]:结束标签。
优点:
- 简单快捷,无需修改数据库。
- 对系统性能影响小。
缺点:
- 不精确:它只能判断“有评论”或“无评论”,无法显示具体的评论数量(3条评论”)。
- 依赖后台手动勾选“有评论”属性,如果发布文章时忘记勾选,即使有评论也不会显示。
使用自定义SQL查询(推荐,可显示具体数量)
如果你想显示具体的评论数量(如“5条评论”),就必须使用自定义SQL来查询 dede_feedback 表(评论表)并统计数量。
原理:
通过 JOIN 连接 dede_archives(文章表)和 dede_feedback(评论表),根据文章ID(aid)进行分组统计,得到每篇文章的评论数。
操作步骤:
-
修改首页模板: 同样,进入“模板” -> “默认模板管理”,编辑你的首页模板
index.htm。 -
在
{dede:arclist}中使用自定义SQL: 将标准的{dede:arclist}标签替换为使用自定义SQL的版本。{dede:sql sql='SELECT a.*, (SELECT COUNT(*) FROM dede_feedback WHERE arcid = a.id) AS commentCount FROM dede_archives a WHERE a.arctypeid IN (这里填你的栏目ID) ORDER BY a.id DESC LIMIT 0, 10'} <li> <a href="[field:arcurl/]">[field:title/]</a> <!-- 显示具体评论数 --> ([field:commentcount/]) </li> {/dede:sql}
代码解释:
SELECT a.*, (SELECT COUNT(*) FROM dede_feedback WHERE arcid = a.id) AS commentCount:a.*:选择dede_archives表(别名a)的所有字段,比如标题、链接等。(SELECT COUNT(*) FROM ...):这是一个子查询,它会为每一篇主查询的文章执行一次,统计dede_feedback表中arcid等于当前文章id的记录总数。AS commentCount:将统计结果命名为commentCount,这样我们就可以用[field:commentcount/]来调用它。
FROM dede_archives a:指定主表为dede_archives,并起别名为a。WHERE a.arctypeid IN (这里填你的栏目ID):这是筛选条件,如果你想只显示特定栏目下的文章,就把括号里的数字替换成对应的栏目ID,如果想显示所有栏目,可以去掉这个WHERE条件,或者用a.arcrank > -1代替。ORDER BY a.id DESC LIMIT 0, 10:按文章ID降序排列,并限制只输出10条记录,这和arclist的row='10'效果一样。[field:commentcount/]:直接调用我们通过SQL查询得到的评论数量。
优点:
- 精确:可以显示每篇文章的具体评论数量。
- 功能强大,逻辑严谨。
缺点:
- 相比方法一,SQL语句稍复杂。
- 如果首页文章数量非常多,可能会对数据库造成一定的查询压力,但通常首页显示10-20条,影响可以忽略不计。
总结与对比
| 特性 | 方法一 (官方标签) | 方法二 (自定义SQL) |
|---|---|---|
| 功能 | 只能判断“有/无” | 可以显示具体数量 |
| 精确度 | 低,依赖后台操作 | 高,直接查询数据库 |
| 性能 | 极好,几乎无影响 | 良好,单次查询开销小 |
| 易用性 | 非常简单,适合新手 | 需要懂一点SQL |
| 推荐场景 | 只需要一个简单的“有评论”标记 | 需要显示“X条评论”等具体数据 |
最终建议:
- 如果你的需求仅仅是告诉访客“这篇文章有人评论过”,方法一完全够用,且最简单。
- 如果你想展示更丰富的信息,已有5条评论”,提升用户体验,强烈推荐使用方法二,这是更专业、更标准的做法。
