核心原理
arclist 标签本身默认只调用系统常用的字段,如 id, title, arcurl, pubdate, litpic 等,要调用自定义字段,你需要明确告诉 arclist 标签:“我需要这个额外的字段”,然后系统才会去数据库里查询并返回它。

这个过程主要涉及两个关键属性:
addfields: 指定你要调用的自定义字段名。channelid: 指定这些自定义字段属于哪个模型(频道),这是最关键的一步,因为不同模型的自定义字段是独立的。
操作步骤
假设你已经完成了以下准备工作:
- 在后台创建了自定义模型(一个名为“产品”的模型)。
- 在该模型中添加了自定义字段,
price(价格)、brand(品牌)、specs(规格) 等。 - 使用这个“产品”模型发布了一些文章。
第1步:确定你的模型ID (channelid)
在调用 arclist 之前,你必须知道你的自定义模型对应的 频道ID。
- 如何查找?
- 登录 DedeCMS 后台。
- 进入【核心】 -> 【内容模型管理】。
- 在列表中找到你创建的自定义模型(产品”)。
- 查看该模型最左侧的 “ID” 列,这个数字就是你的
channelid,如果你的“产品”模型是第5个创建的,它的ID可能就是5。
第2步:编写 arclist 标签代码
你可以使用以下格式的 arclist 标签来调用自定义字段了。

基本语法:
{dede:arclist channelid='你的模型ID' addfields='字段名1,字段名2' row='10' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 调用自定义字段 -->
价格: [field:price/]
品牌: [field:brand/]
</li>
{/dede:arclist}
参数详解:
-
channelid='你的模型ID'- 必填,将
你的模型ID替换为你在第一步中找到的数字ID。channelid='5',这一步至关重要,否则addfields不会生效。
- 必填,将
-
addfields='字段名1,字段名2'- 必填,指定要调用的自定义字段名,多个字段用英文逗号 隔开,字段名必须是你在后台模型中精确设置的“字段名称”,而不是“字段别名”。
addfields='price,brand,specs'。
- 必填,指定要调用的自定义字段名,多个字段用英文逗号 隔开,字段名必须是你在后台模型中精确设置的“字段名称”,而不是“字段别名”。
-
row='10'- 可选,表示调用多少条记录。 len='30'`
- 可选,表示标题字符长度。
-
[field:自定义字段名/]- 在
arclist循环体内,使用这个格式来输出自定义字段的值。[field:price/]。
- 在
完整示例
假设我们有一个“产品展示”栏目,它使用的是 ID 为 6 的自定义模型,该模型有三个自定义字段:
- 字段名称:
price(价格) - 字段名称:
brand(品牌) - 字段名称:
intro(简介)
我们想在首页调用这个栏目下的产品列表。
指定栏目ID (typeid) 并调用自定义字段
<h2>我们的产品</h2>
<ul>
{dede:arclist
typeid='产品展示栏目的ID'
channelid='6'
addfields='price,brand,intro'
row='5'
titlelen='20'}
<li>
<h3><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h3>
<p>品牌: [field:brand/]</p>
<p>价格: ¥[field:price/] 元</p>
<p class="intro">[field:intro/]</p>
</li>
{/dede:arclist}
</ul>
直接调用指定模型的所有文章(不限定栏目)
如果你不关心文章属于哪个栏目,只想调用所有使用了该模型的文章,可以省略 typeid。
<h2>全部产品</h2>
<ul>
{dede:arclist
channelid='6'
addfields='price,brand'
row='8'}
<li>
<a href="[field:arcurl/]">[field:title/]</a> - [field:brand/]
</li>
{/dede:arclist}
</ul>
常见问题与解决方案
问题1:为什么我加了 addfields 但自定义字段显示为空?
最可能的原因:忘记设置 channelid 或 channelid 错误。
arclist 需要知道去哪个数据表里找这些自定义字段。channelid 就是指路牌,请务必确保 channelid 的值是正确的。
问题2:channelid 和 typeid 有什么区别?
这是一个非常容易混淆的概念,请务必分清楚:
| 属性 | 全称 | 作用 | 关联对象 |
|---|---|---|---|
typeid |
栏目ID | 限定文章的来源,指定只调用某个或某几个栏目下的文章。 | 栏目 (如“产品展示”、“新闻中心”) |
channelid |
模型ID | 限定文章的模型,指定只调用使用了某个自定义模型的文章,并使其自定义字段可用。 | 内容模型 (如“产品模型”、“下载模型”) |
简单记忆:
typeid回答的是:“从哪个栏目里取?”channelid回答的是:“取哪种类型的文章?”
在调用自定义字段时,channelid 是必需的,typeid 是可选的。
问题3:如何给自定义字段添加默认样式或格式化输出?
你可以使用 function 属性对字段值进行处理。
示例1:价格格式化(保留两位小数)
[field:price function='sprintf("%.2f", @me)'/]
@me是 DedeCMS 的一个内置变量,代表当前字段的原始值。sprintf()是 PHP 的格式化函数。
示例2:截取简介长度
[field:intro function='cn_substr(@me, 100)'/]
cn_substr()是 DedeCMS 的常用函数,用于截取中文字符串,避免乱码。
问题4:arclist 调用太慢,有替代方案吗?
对于需要调用大量自定义字段的场景,arclist 因为需要查询 dede_archives 表和额外的附加表,性能可能会下降,此时可以考虑使用 SQL 查询标签 {dede:sql}。
{dede:sql} 的优势是直接写 SQL 语句,可以精确控制查询的字段和表,效率更高。
示例:使用 {dede:sql} 调用产品信息
假设你的产品模型ID是 6,附加表是 dede_addon6。
{dede:sql sql="
SELECT
a.id, a.title, a.litpic, a.pubdate,
b.price, b.brand
FROM
dede_archives AS a
JOIN
dede_addon6 AS b ON a.id = b.aid
WHERE
a.channel = 6
ORDER BY
a.id DESC
LIMIT 0, 10
"}
<li>
<a href="/plus/view.php?aid=[field:id/]">[field:title/]</a>
价格: [field:price/] 品牌: [field:brand/]
</li>
{/dede:sql}
dede_archives是主表,存放文章的基本信息。dede_addon6是附加表,6是你的模型ID,存放自定义字段。a.channel = 6确保我们只查询模型ID为6的文章。
注意: 使用 {dede:sql} 需要你对 DedeCMS 的数据表结构有一定了解,并且要小心SQL注入风险(通常后台调用是安全的)。
- 核心:调用自定义字段必须同时使用
