第一步:确保你的自定义字段已正确创建和填写
在调用之前,请务必确认:

- 模型已创建字段:在后台的“核心” -> “内容模型管理”中,为你所使用的模型(文章模型”)添加了自定义字段,我们添加一个名为
video_url的视频链接字段,类型为“单行文本”。 - 内容已填写字段:在发布或编辑文章时,已经为该字段填写了值,如果字段为空,调用后将显示空白。
页(article_article.htm)中调用
这是最简单的情况,因为文章页的模板变量中已经包含了当前文章的所有信息,包括自定义字段。
语法:
直接使用 field: 加上你的字段名。
示例:
假设我们创建了一个名为 writer 的“作者”字段,想在文章页显示作者信息。
<div class="author">
<span>作者:</span>
{field:writer}
</div>
进阶用法:
如果字段类型是“多行文本”,并且你希望保留其中的换行符,可以使用 nl2br 函数。

<div class="description">
<h3>内容简介</h3>
{field:description function='nl2br(@me)'/}
</div>
@me是一个特殊变量,代表当前字段的原始值。nl2br()函数会将字符串中的换行符\n转换成 HTML 的<br>
在列表页(list_*.htm)或首页(index.htm)中调用
在列表页调用自定义字段稍微复杂一些,因为列表页是通过织梦的标签循环调用多篇文章的,你需要使用 arclist 或 list 标签,并配合 array 属性来指定需要调用的字段。
核心标签:arclist (推荐用于首页、频道页)
语法:
在 arclist 标签内使用 typeid (指定栏目ID) 和 addfields (指定要调用的自定义字段名,多个字段用逗号隔开)。
示例:
在首页调用“产品”栏目(ID=1)下的文章,并显示自定义字段 product_price (价格) 和 product_model (型号)。
{dede:arclist typeid='1' titlelen='30' addfields='product_price,product_model'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<p>型号:[field:product_model/]</p>
<p>价格:¥[field:product_price/] 元</p>
</li>
{/dede:arclist}
参数说明:

typeid='1':调用栏目ID为1下的文章。addfields='product_price,product_model':这是关键,告诉织梦在获取文章列表时,额外获取product_price和product_model这两个字段的值。[field:product_price/]:在循环体内,使用field:加上字段名来调用单个值。
核心标签:list (专门用于列表页)
列表页模板(如 list_article.htm)默认的循环标签是 {dede:list},它的用法与 arclist 非常相似。
示例:
在文章列表页模板中,调用自定义字段 source (来源)。
{dede:list pagesize='10' addfields='source'}
<div class="list-item">
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<div class="info">
<span>来源:[field:source/]</span>
<span>发布时间:[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</div>
</div>
{/dede:list}
注意:{dede:list} 默认不支持分页标签 {dede:pagelist/},如果需要分页,请使用 {dede:arclist} 标签并配合 typeid 来模拟列表页。
使用SQL语句直接调用(最灵活、最强大)
当 arclist 和 list 标签无法满足复杂需求时(需要跨表查询、进行特定条件筛选),可以直接使用SQL语句。
语法:
使用 {dede:sql} 标签,编写SQL查询语句。
示例1:调用指定栏目的文章及其自定义字段
假设我们要调用“新闻”栏目(ID=3)下的所有文章,并显示标题和自定义字段 editor (编辑)。
{dede:sql sql="SELECT id, title, editor FROM `dede_archives` a LEFT JOIN `dede_addonarticle` b ON a.id = b.aid WHERE a.typeid = 3"}
<div>
<h3>[field:title/]</h3>
<p>编辑:[field:editor/]</p>
</div>
{/dede:sql}
SQL语句解析:
SELECT id, title, editor:选择要查询的字段。id是文章主表ID,title是标题,editor是我们自定义的字段(它在附加表dede_addonarticle中)。FROMdede_archivesa:从主表dede_archives查询,并给它一个别名a。LEFT JOINdede_addonarticleb ON a.id = b.aid:通过LEFT JOIN连接附加表dede_addonarticle(别名b),连接条件是文章ID (a.id和b.aid)。注意:附加表的表名因模型而异,文章模型通常是dede_addonarticle,图集是dede_addonimages,等等。WHERE a.typeid = 3:查询条件,只选择栏目ID为3的文章。
示例2:调用自定义表单的数据
如果你的自定义字段是在一个独立的自定义表单中,调用方法类似。
假设有一个自定义表单,表单名为 dede_diyform1,要调用里面的 company_name 和 contact_person 字段。
{dede:sql sql="SELECT company_name, contact_person FROM `dede_diyform1` WHERE status = 1"}
<p>公司:[field:company_name/]</p>
<p>联系人:[field:contact_person/]</p>
{/dede:sql}
常见问题与注意事项 (FAQ)
-
为什么调用后显示空白?
- 最常见原因:没有在
arclist或list标签中使用addfields属性来声明要调用的自定义字段。 - 数据为空:该篇文章的这个自定义字段本身就是空的。
- 字段名错误:检查字段名是否与数据库中的一致,注意大小写。
- 附加表错误:如果使用SQL,确保连接了正确的附加表(如
dede_addonarticle)。
- 最常见原因:没有在
-
addfields和sql的选择?- 优先使用
addfields:对于列表页和首页的常规调用,addfields是最简单、最高效、最安全的方式,符合织梦的设计规范。 sql用于特殊场景:当你需要非常复杂的查询逻辑,比如跨表、联合查询、特定排序、或者调用非文章模型的数据时,sql是不二之选,但要注意SQL注入风险,尽量使用固定的ID和字段名。
- 优先使用
-
如何调用图片/文件字段? 如果你的自定义字段类型是“图片”或“文件”,调用时它会返回一个路径字符串,你可以直接使用
field:fieldname,或者用@me进行处理。示例(图片字段
pic):<img src="[field:pic/]" alt="[field:title/]" />
如果需要调用上传时的原始描述文字(如果有的话),可能需要通过SQL查询附加表的对应文本字段。
| 调用位置 | 推荐标签 | 关键代码/属性 | 示例 |
|---|---|---|---|
| 页 | 无需标签 | {field:字段名} |
{field:writer/} |
| 列表页/首页 | arclist / list |
addfields='字段名1,字段名2' |
{dede:arclist addfields='price'}...[field:price]...{/dede:arclist} |
| 复杂需求 | sql |
sql="SELECT ... FROM ..." |
{dede:sql sql="..."}...[field:字段名]...{/dede:sql} |
希望这份详细的指南能帮助你完全掌握在织梦中调用自定义字段的方法!
