核心思路
在列表页调用好评,本质上是在循环列表项(artlist)的同时,为每一个列表项去查询其对应的详细信息(archives表),并从中提取好评数据。

(图片来源网络,侵删)
使用SQL联合查询(推荐,性能最佳)
这是最推荐的方法,因为它只需要一次数据库查询就能获取所有列表项及其对应的好评数据,效率最高,它利用了dede_arctype(栏目表)、dede_archives(文档主表)和dede_addonarticle(文章附加表,假设你把好评信息存在这里)。
前提条件:
- 你有一个字段用来存储好评数,
good_rate。 - 这个字段位于文章的附加表里(通常是
dede_addonarticle或你自定义的模型附加表)。
操作步骤:
- 进入后台 -> 模板 -> 标签调用
- 修改或创建列表页模板,
list_article.htm。 - 找到列表页的循环标签,通常是
{dede:list}。 - 将
{dede:list}替换为使用arclist标签并自定义SQL的写法。
代码示例:
假设你的好评数字段在 dede_addonarticle 表中,字段名为 good_rate。
{dede:arclist typeid='栏目ID' row='10' titlelen='40' orderby='pubdate'}
<li>
<!-- 文章标题 -->
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 在这里调用好评数 -->
<span>好评:[field:good_rate/]</span>
<!-- 其他字段... -->
</li>
{/dede:arclist}
上面的代码会报错,因为 arclist 默认不包含附加表字段,我们需要用它的 sql 属性来自己写查询语句。
{dede:arclist
typeid='栏目ID'
row='10' len='40'
orderby='pubdate'
sql="
SELECT
a.id, a.title, a.pubdate, a.typeid,
t.typename,
g.good_rate -- 从附加表g中选取good_rate字段
FROM
dede_archives AS a -- 主表a
LEFT JOIN
dede_arctype AS t ON a.typeid = t.id -- 关联栏目表t
LEFT JOIN
dede_addonarticle AS g ON a.id = g.aid -- 关联附加表g,通过文章ID(aid)关联
WHERE
a.typeid IN (栏目ID) -- 指定栏目
ORDER BY
a.pubdate DESC
LIMIT
0, 10 -- 对应row='10'
"
}
<li>
<!-- 文章标题 -->
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 调用好评数,这里的字段名是sql查询中定义的 'good_rate' -->
<span>好评:[field:good_rate/]</span>
<!-- 调用栏目名 -->
<span>栏目:[field:typename/]</span>
<!-- 其他字段... -->
</li>
{/dede:arclist}
代码解释:

(图片来源网络,侵删)
SELECT ... FROM dede_archives AS a: 从主表dede_archives查询,并给它起个别名a。LEFT JOIN dede_addonarticle AS g ON a.id = g.aid: 关联附加表dede_addonarticle(别名g),关联条件是文章主表的id等于附加表的aid。SELECT g.good_rate: 在SELECT语句中明确指出我们要获取附加表中的good_rate字段。[field:good_rate/]: 在模板中,通过field标签调用SQL查询中返回的字段。
使用嵌套套娃标签(简单但性能较差)
如果你的列表页逻辑比较简单,或者不想写复杂的SQL,可以使用这种方法,它的原理是:在 {dede:list} 循环内部,再使用 {dede:field} 标签来获取当前文章的附加字段。
前提条件:
与方法一相同,需要一个存储好评数的附加字段。
操作步骤:
- 确保附加字段已正确关联:在后台“模型管理”中,确保你的文章模型已经关联了包含
good_rate字段的附加表。 - 在列表模板中使用嵌套标签。
代码示例:
{dede:list typeid='栏目ID' row='10' titlelen='40'}
<li>
<!-- 文章标题 -->
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 使用嵌套标签调用附加字段 -->
{dede:field name='good_rate'/}
<!-- 其他字段... -->
</li>
{/dede:list}
代码解释:
{dede:list}会循环输出每一篇文章。{dede:field name='good_rate'/}会自动获取当前循环到的这篇文章的附加字段good_rate的值。
⚠️ 性能警告:
这种方法存在“N+1查询”问题。{dede:list} 会先执行一次查询获取文章列表(比如10条),然后对于列表中的每一条文章,它都会再执行一次查询来获取其附加字段,当列表行数多时,会产生大量的数据库查询,导致页面加载缓慢。不推荐在列表页行数较多时使用。

(图片来源网络,侵删)
调用好评率百分比(如果存储的是好评数和总评数)
如果你的数据结构是存储了“好评数”和“总评数”,想计算出好评率百分比,可以在模板中使用 php 代码片段来实现。
假设字段:
good_count: 好评数total_count: 总评数
代码示例(使用方法一的SQL联合查询):
{dede:arclist
typeid='栏目ID'
row='10' len='40'
orderby='pubdate'
sql="
SELECT
a.id, a.title, a.pubdate,
g.good_count,
g.total_count
FROM
dede_archives AS a
LEFT JOIN
dede_addonarticle AS g ON a.id = g.aid
WHERE
a.typeid IN (栏目ID)
ORDER BY
a.pubdate DESC
LIMIT 0, 10
"
}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 使用PHP代码计算并显示好评率 -->
[field:total_count runphp='yes']
if (@me > 0) {
$rate = @me / 100; // 假设total_count是100的倍数,如100代表100条评价
// 或者直接 $rate = @me; 如果total_count就是总数
$percentage = round(($GLOBALS['good_count'] / @me) * 2, 1); // 乘以2保留一位小数,如4.5分
@me = " (" . $percentage . "分)";
} else {
@me = " (暂无评价)";
}
[/field:total_count]
</li>
{/dede:arclist}
代码解释:
[field:total_count runphp='yes']:runphp='yes'允许我们在标签内执行PHP代码。@me: 在runphp中,@me代表当前字段的原始值,这里是total_count。$GLOBALS['good_count']: 因为我们在同一个arclist循环中,可以通过全局变量$GLOBALS来获取当前循环项的其他字段值(如good_count)。@me = "...": 将计算好的字符串重新赋值给@me,模板就会输出这个结果。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| SQL联合查询 | 性能最佳,代码清晰,功能强大 | 需要编写SQL语句,对新手有一定门槛 | 强烈推荐,尤其是列表行数较多或对性能有要求的网站。 |
| 嵌套套娃标签 | 使用简单,标签直观 | 性能较差,有“N+1查询”问题 | 仅适用于列表行数极少(如5条以内)的简单页面。 |
| PHP计算 | 灵活,可处理复杂逻辑(如计算百分比) | 依赖PHP,可读性稍差 | 当你需要对原始数据进行二次计算(如求百分比、格式化)时使用。 |
对于绝大多数情况,请优先选择方法一(SQL联合查询),它是在织梦列表页调用附加字段最规范、最高效的解决方案。
