核心原理
DedeCMS 的点击次数存储在两个地方:

- 主表 (
#@__archives): 这是文章的主数据表,有一个字段click专门用来存储点击次数。 - 附加表 (
#@__addonarticle): 这是文章的附加表,通常用于存储文章内容、来源、作者等信息,默认情况下,点击次数也在这里存储,字段名也是click。
关键点:你的模板调用哪个表的字段,取决于你在后台“系统” -> “系统基本参数” -> “核心设置”中,如何配置“文章点击调用”:
- 选项 A (推荐):
makehtml(click)- 只在生成 HTML 页面时更新点击数,这是最常用、性能最好的方式。 - 选项 B:
onclick- 每次页面被访问时都更新点击数,这种方式会频繁更新数据库,对网站性能有轻微影响,且容易受到刷点击的攻击。
强烈建议:为了网站性能和稳定性,请确保你在后台选择了 makehtml(click)。
使用 GetOneArctype 标签(推荐,兼容性强)
这是最经典、最稳定的方法,适用于所有 DedeCMS 版本,它通过栏目ID来获取栏目的特定字段,其中就包括 click。
代码示例:

{dede:channel type='self' typeid=''}
<a href="[field:typelink/]">[field:typename/]</a> (点击: [field:click/])
{/dede:channel}
代码解释:
{dede:channel type='self' typeid=''}: 这是一个栏目列表标签。type='self': 表示只调用当前栏目本身,而不是它的子栏目。typeid='': 留空,系统会自动获取当前栏目的ID。
[field:typelink/]: 调用栏目的链接地址。[field:typename/]: 调用栏目的名称。[field:click/]: 核心代码,调用当前栏目的点击次数。
注意:这个方法调用的是栏目的点击次数,而不是列表页中每一篇文章的点击次数,如果你想在列表页的每篇文章后面都显示其点击次数,请使用下面的方法。
在列表循环中调用文章点击次数(最常用)
这是在列表页模板中,为每一篇文章显示其点击次数的标准方法。
代码示例:

假设你的列表页模板文件是 list_article.htm,你需要修改列表文章的循环部分。
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>点击: [field:click/]</span>
<span>日期: [field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:list}
代码解释:
{dede:list ...}: 这是文章列表循环标签。[field:arcurl/]: 文章的链接地址。[field:title/]: 文章的标题。[field:click/]: 核心代码,直接在列表循环中调用当前文章的点击次数。
为什么这个方法有效?
因为 {dede:list} 标签在循环时,会为每一篇文章生成一个记录集,[field:click/] 就是获取当前这条记录(也就是这篇文章)的 click 字段的值。
使用SQL直接查询(灵活但需谨慎)
如果你需要更复杂的逻辑,或者默认的字段调用不满足需求,可以直接使用SQL查询。
代码示例:
{dede:sql sql='SELECT click FROM `#@__archives` WHERE id = ~id~'}
当前文章点击次数: [field:click/]
{/dede:sql}
代码解释:
{dede:sql ...}: DedeCMS的自定义SQL查询标签。SELECT click FROM#@__archivesWHERE id = ~id~:SELECT click: 从主表中选择click字段。FROM#@archives`从文章主表中查询(如果你的点击数在附加表,就换成#@addonarticle`)。WHERE id = ~id~:~id~是一个特殊变量,代表当前文章的ID,这个查询会只获取当前文章的点击数。
[field:click/]: 输出查询结果。
⚠️ 重要警告: 直接使用SQL有风险,请确保:
- 你的点击数确实存储在
#@__archives表中(通过后台设置确认)。 - 如果你的点击数在附加表
#@__addonarticle,你需要同时指定aid字段来关联,并且SQL会更复杂一些。 - 避免在循环中执行复杂查询,以免影响性能。
对于附加表的情况,SQL可以这样写(需要开启字段调用功能):
确保在后台“系统”->“系统基本参数”->“其他选项”中,勾选了“使用多余的字段描述”。
然后在模板中:
{dede:list}
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 假设附加表字段为click,且已开启调用 -->
<span>点击: [field:click/]</span>
{/dede:list}
方法二在大多数情况下已经足够,因为 {dede:list} 标签会自动处理主表和附加表的字段合并。
总结与最佳实践
| 方法 | 适用场景 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|---|
方法一 (GetOneArctype) |
调用栏目的点击次数 | 简单、稳定 | 不能用于调用文章的点击次数 | ★★★☆☆ |
方法二 ({dede:list}循环) |
在列表页调用每篇文章的点击次数 | 最标准、最常用、性能最好 | 无明显缺点 | ★★★★★ |
| 方法三 (SQL查询) | 需要自定义或特殊逻辑时 | 灵活强大 | 有一定风险,可能影响性能,需要懂SQL | ★★☆☆☆ |
最终推荐:
对于99%的在列表页调用文章点击次数的需求,直接使用 方法二 是最简单、最可靠、性能最好的选择。
{dede:list pagesize='20'}
<h2><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h2>
<p class="info">
发布时间:[field:pubdate function="MyDate('Y-m-d',@me)"/]
点击次数:<span class="click">[field:click/]</span>
来源:[field:source/]
作者:[field:writer/]
</p>
<div class="summary">
[field:description function='cn_substr(@me,120)'/]...
</div>
{/dede:list}
最后再强调一遍:请务必检查后台的“文章点击调用”设置,并选择 makehtml(click),这对于网站长期稳定运行至关重要。
