在 arclist 中调用自定义字段,主要有两种方法:

(图片来源网络,侵删)
- 直接调用(推荐):在
arclist标签中使用addfields='字段名1,字段名2'和channelid='栏目ID'属性,这是最直接、最高效的方式。 - SQL 查询调用:通过
innertext结合php代码,自己编写 SQL 查询来获取并显示自定义字段,这种方式最灵活,但代码量稍多。
第一步:准备工作(非常重要)
在调用任何自定义字段之前,请确保你已经完成了以下设置,否则调用会失败。
-
添加自定义字段:
- 进入后台的「核心」-「内容模型管理」。
- 选择你的内容模型(通常是“文章模型”),点击后面的“更改”或“管理字段”。
- 在“字段管理”页面,点击“添加新字段”。
- 字段名:这是你在代码中调用的唯一标识,建议使用英文,
director(导演)、actor(演员)、price(价格)。 - 字段提示:在后台添加内容时,这个文字会出现在输入框上方,请输入电影导演”。
- 字段类型:根据你的需求选择,如“单行文本”、“多行文本”、“数字”、“图片”等。
- 保存设置。
-
更新数据库结构:
- 添加完字段后,DedeCMS 会提示你“成功增加一个字段”,但此时数据表结构可能还未完全更新,为了确保万无一失,请手动执行一次“一键更新网站数据缓存”。
- 进入后台的「系统」-「一键更新网站」-「更新数据库」。
-
中填写数据:
(图片来源网络,侵删)- 发布一篇新文章,或者编辑一篇旧文章。
- 你会看到刚才添加的自定义字段输入框,请填入一些测试数据。
第二步:在 arclist 中调用自定义字段
假设你已经添加了一个名为 myintro 的自定义字段(字段类型为“多行文本”),现在要在首页的列表中调用它。
直接调用(最常用、最推荐)
这是最简单直接的方法,通过 arclist 的两个属性即可实现。
标签结构:
{dede:arclist addfields='myintro' channelid='1' row='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<p>自定义内容:[field:myintro/]</p>
</li>
{/dede:arclist}
关键属性解释:

(图片来源网络,侵删)
-
addfields='myintro':- 作用:告诉
arclist标签,你需要额外从数据库中取出哪些自定义字段。 - 格式:字段名之间用英文逗号 隔开。
addfields='director,actor,price'。 - 注意:必须包含你想要显示的所有自定义字段名。
- 作用:告诉
-
channelid='1':- 作用:至关重要! 指定自定义字段所在的内容模型ID。
- 如何找到 ID:
- 进入「核心」-「内容模型管理」。
- 将鼠标悬停在你使用的模型(如“文章模型”)上,浏览器状态栏或链接信息里会显示
id=1或其他数字,这个数字就是channelid。 - 对于文章模型,通常是
1;对于图集模型,通常是2,以此类推。
channelid错误或缺失,addfields将无法获取到数据,调用会显示为空。
完整示例:
假设我们有一个电影资讯栏目,模型ID为1,自定义了 director(导演)、release_date(上映日期)两个字段。
<h3>最新电影资讯</h3>
<ul>
{dede:arclist
typeid='3'
row='8'
titlelen='30'
addfields='director,release_date'
channelid='1'
}
<li>
<span class="title"><a href="[field:arcurl/]">[field:title/]</a></span>
<span class="info">导演:[field:director/] | 上映:[field:release_date/]</span>
</li>
{/dede:arclist}
</ul>
通过 innertext 和 PHP 调用(更灵活)
当你的逻辑比较复杂,或者需要在循环内部进行判断时,可以使用这种方法。
标签结构:
{dede:arclist row='5'}
[field:array runphp='yes']
$id = @me['id']; // 获取当前文章的ID
$query = "SELECT myintro FROM dede_addonarticle WHERE aid = $id"; // 查询自定义字段
$row = $dsql->GetOne($query);
@me = '<li><a href="'.@me['arcurl'].'">'.@me['title'].'</a>';
if($row) {
@me .= '<p>自定义内容:'.$row['myintro'].'</p>';
}
@me .= '</li>';
[/field:array]
{/dede:arclist}
代码解释:
{dede:arclist row='5'}:正常使用arclist循环。[field:array runphp='yes']:这是一个特殊用法,它会将当前文章的所有信息(包括ID、标题、URL等)以数组形式传递给@me变量,并允许执行PHP代码。$id = @me['id'];:从数组中获取当前文章的ID。$query = "SELECT myintro FROM dede_addonarticle WHERE aid = $id";:dede_addonarticle是文章模型的自定义字段数据表,如果你的模型是图集,表名可能是dede_addonimages,表名规则通常是dede_addon + 模型表后缀。myintro是你要查询的字段名。aid是文章ID。
$row = $dsql->GetOne($query);:执行查询并获取结果。@me = '...':重新构建@me的值,即最终要输出的HTML内容,你可以在这里拼接任何HTML和PHP变量。if($row):判断查询结果是否存在,避免在没有数据时出错。@me .= '</li>';:拼接HTML的结束标签。
常见问题与注意事项 (FAQ)
-
为什么我调用自定义字段显示为空?
- 最常见原因:忘记设置
channelid属性,或者channelid设置错误。 - 检查:确保
addfields中填写的字段名与后台添加的字段名完全一致(区分大小写)。 - 检查:是否已经执行了“更新数据库”操作。
- 检查:在后台发布内容时,是否已经为该字段填写了数据。
- 最常见原因:忘记设置
-
如何调用图片类型的自定义字段?
- 和文本字段一样,使用
addfields和channelid。 - 调用时使用
[field:imgurl/]标签,它会自动输出图片的完整路径。 - 示例:假设自定义字段名为
movie_poster。{dede:arclist addfields='movie_poster' channelid='1' row='3'} <div class="movie-item"> <img src="[field:movie_poster/]" alt="[field:title/]"> <a href="[field:arcurl/]">[field:title/]</a> </div> {/dede:arclist}
- 和文本字段一样,使用
-
如何调用多行文本字段并截取字数?
arclist的infolen属性通常只用于文章摘要(description),对于自定义字段,你需要使用cn_substr函数。- 示例:截取
myintro字段的前50个字符。[field:myintro function='cn_substr(@me, 50)'/]
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 直接调用 | 代码简洁、效率高、易于维护 | 灵活性相对较低 | 绝大多数常规的自定义字段调用需求 |
| PHP调用 | 灵活性极高、可以进行复杂逻辑判断和循环 | 代码量多、可读性稍差、对PHP有一定要求 | 需要根据字段值进行条件判断、需要循环处理自定义字段内容等复杂场景 |
对于绝大多数用户来说,强烈推荐使用方法一(直接调用),它既简单又高效,只有在方法一无法满足你的特殊需求时,才考虑使用方法二。
