下面我将为你详细讲解如何实现,从简单到复杂,并提供不同情况下的解决方案。

(图片来源网络,侵删)
核心原理
列表页调用自定义字段的核心原理是:
- 修改列表页模板:在
list_article.htm模板文件中,找到循环内容的标签{dede:list}。 - 获取字段值:在
{dede:list}循环内部,使用专门的标签来获取当前文章的自定义字段值,这个标签不是像内容页那样直接用[field:自定义字段名/],而是需要调用PHP函数来获取。
使用 GetArcyv() 函数(最常用、最推荐)
这是最标准、最安全的方法,适用于大多数情况。
步骤 1:确保自定义字段已正确创建并添加到模型
- 登录DedeCMS后台。
- 进入「核心」 -> 「内容模型管理」。
- 找到你正在使用的模型(文章模型”),点击「更改」或「字段管理」。
- 在字段管理中,确保你的自定义字段已经创建,并且勾选了“使字段在列表页可以调用”这一项,这是非常关键的一步!
步骤 2:修改列表页模板 list_article.htm
- 使用FTP或文件管理器,找到你的模板目录下的
list_article.htm文件。 - 打开该文件,找到
{dede:list}- 在
{dede:list}循环内部,使用以下语法来调用自定义字段: - 在
{dede:list pagesize='20'}
<li>
<!-- 调用文章标题 -->
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 调用文章摘要 -->
<p>[field:description function='cn_substr(@me,100)'/]...</p>
<!-- 调用自定义字段,我们创建了一个叫 "shuxing1" 的字段 -->
<span>自定义字段1的值是:[field:id function="GetArcyv(@me, 'shuxing1')"/]</span>
<!-- 调用另一个自定义字段,我们创建了一个叫 "price" 的字段 -->
<span>价格:[field:id function="GetArcyv(@me, 'price')"/]</span>
<!-- 调用自定义字段(单选/多选类型),一个叫 "leixing" 的字段 -->
<span>类型:[field:id function="GetArcyv(@me, 'leixing')"/]</span>
<!-- 调用自定义字段(图片类型),一个叫 "tuwen" 的字段 -->
<!-- 注意:图片字段通常返回的是图片路径,需要加上网站根目录 -->
<img src="[field:id function="GetArcyv(@me, 'tuwen')"/]" alt="图片" />
</li>
{/dede:list}
语法解析:
[field:id function="GetArcyv(@me, '字段名')"]field:id:这里的id是一个占位符,它代表当前循环中的文章ID。@me会自动替换为这个ID。function="...":这是调用PHP函数的指令。GetArcyv():这是DedeCMS专门用于从附加表获取自定义字段值的函数。'字段名':就是你后台创建的字段名(英文),shuxing1,price等。
步骤 3:更新列表页缓存
修改完模板后,回到后台的「生成」 -> 「更新HTML」:

(图片来源网络,侵删)
- 选择「更新列表页」。
- 点击“开始生成”。
系统会重新解析模板并生成新的列表页,这样你才能看到效果。
使用 array 循环(适用于需要复杂逻辑或更多字段)
如果你的列表页需要调用非常多的自定义字段,或者需要一些复杂的判断逻辑,可以使用 array 循环的方式,这种方法更灵活,但代码稍多。
步骤 1:与方法一相同
确保自定义字段已创建并勾选了“使字段在列表页可以调用”。
步骤 2:修改列表页模板 list_article.htm
将 {dede:list} 标签替换为 {dede:arclist},并设置 typeid 和 addfields 参数。

(图片来源网络,侵删)
{dede:arclist typeid='0' addfields='shuxing1,price,leixing,tuwen' pagesize='20'}
<li>
<!-- 调用文章标题 -->
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 调用自定义字段 -->
<!-- 这种方式下,可以直接使用 [field:字段名/] -->
<span>自定义字段1的值是:[field:shuxing1/]</span>
<span>价格:[field:price/]</span>
<span>类型:[field:leixing/]</span>
<!-- 调用图片字段 -->
<img src="[field:tuwen/]" alt="图片" />
<!-- 你还可以在这里加入其他判断 -->
[field:price runphp='yes']
if(@me > 100) {
@me = "<b style='color:red;'>高价:".@me."</b>";
} else {
@me = "平价:".@me;
}
[/field:price]
</li>
{/dede:arclist}
语法解析:
{dede:arclist ...}:使用arclist标签来模拟列表页。typeid='0':表示调用所有栏目,如果只想调用特定栏目,填入栏目ID。addfields='shuxing1,price,leixing,tuwen':这是关键参数!它告诉系统在列表查询时,需要从附加表中查询哪些自定义字段,字段名之间用英文逗号隔开。[field:字段名/]:一旦在addfields中声明了字段,就可以像调用普通字段一样直接使用。
步骤 3:更新列表页缓存
与方法一相同,更新列表页HTML。
常见问题与注意事项
-
为什么我的自定义字段在列表页显示为空?
- 最常见原因:在后台「内容模型管理」的字段管理中,忘记勾选“使字段在列表页可以调用”,请检查并勾选,然后更新缓存。
- 字段名错误:检查模板中
GetArcyv()函数里的字段名是否与后台创建的字段名完全一致(区分大小写)。 - 缓存问题:确保已经重新生成了列表页。
-
GetArcyv()和addfields方法有什么区别?GetArcyv():按需调用,每调用一次,就会执行一次数据库查询,如果调用次数多,可能会对性能有轻微影响,但代码更直观,适合少量字段。addfields:批量查询,在查询列表时就把所有需要的自定义字段一次性取出来,后续直接使用,性能更好,适合需要调用多个自定义字段的场景,但需要预先知道所有要用到的字段。
-
自定义字段是图片,为什么图片不显示?
-
GetArcyv()和addfields返回的通常是相对路径,如/uploads/allimg/202510/abc.jpg。 -
在模板中,最好使用
[field:全局变量名/]来获取网站根目录,然后拼接路径。<!-- 错误方式 --> <img src="[field:id function="GetArcyv(@me, 'tuwen')"/]" /> <!-- 正确方式 --> <img src="{dede:global.cfg_basehost/}[field:id function="GetArcyv(@me, 'tuwen')"/]" />{dede:global.cfg_basehost/}会输出你的网站域名,如http://www.yoursite.com。
-
-
调用单选/多选框的值显示的是选项ID而不是文字怎么办?
- 这是因为
GetArcyv()默认返回的是选项的值(value),如果你需要显示选项的文字(label),通常需要自己写PHP函数进行转换,或者在后台模型设置中,将字段的“录入方式”设置为“文本框”,而不是“单选/多选框”。
- 这是因为
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
GetArcyv() |
调用少量自定义字段,代码直观。 | 灵活,按需调用,无需预定义字段列表。 | 调用频繁时可能影响性能。 |
addfields |
需要在列表页调用多个自定义字段。 | 性能更好,一次性获取所有数据。 | 需要预先知道所有字段名,不够灵活。 |
对于绝大多数用户来说,方法一 (GetArcyv()) 是最简单、最通用的解决方案,强烈建议从它开始尝试。
