arclist 是织梦中最核心、最常用的列表标签,用于调用文章、图集、软件等任意内容模型的数据,而嵌套 arclist 通常用于实现“一个主列表,每个条目下再显示一个子列表”的复杂布局,

- 新闻列表:显示最新新闻,每条新闻下再显示相关的“热门文章”。
- 产品列表:显示产品分类,每个分类下再显示该分类下的“推荐产品”。
- 文章归档:按年份归档文章,点击某一年份,展开显示该年份下的所有文章。
基本语法与原理
我们回顾一下 arclist 的基本结构:
{dede:arclist flag='h' typeid='1' row='10' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
嵌套的核心原理:
织梦的标签系统是基于“块级”执行的,当解析 {dede:arclist}...{/dede:arclist} 时,它会先找到这个大标签,然后执行内部的PHP代码获取数据,最后将数据填充到模板中。
嵌套的关键在于作用域和命名空间:

- 外层
arclist:我们称之为“父列表”,它有自己的循环变量,如[field:title/]、[field:arcurl/]等。 - 内层
arclist:我们称之为“子列表”,它也有自己的循环变量。
如果内外层都使用默认的 [field:*] 变量,就会产生冲突,子列表的 [field:title] 会覆盖掉父列表的 [field:title],导致显示错误。
为了解决这个问题,织梦 arclist 标签提供了一个至关重要的属性:addfields 和 channelid。
核心属性详解
addfields (必须)
这个属性是嵌套的灵魂,它的作用是:从父列表的当前条目中,提取指定的字段,并将其传递给子列表的可用变量中。
- 语法:
addfields='字段名1,字段名2' - 字段名:必须是你在后台内容模型中定义的字段名,
keywords(关键词)、typeid(栏目ID)、writer(作者) 等。 - 作用:假设父列表的当前文章有
keywords字段,你设置了addfields='keywords',那么在子列表的循环体内,你就可以通过[field:keywords/]来获取到这篇文章的keywords值。
channelid (通常必须)
这个属性指定了子列表要调用哪个内容模型的数据。

- 语法:
channelid='模型ID' - 模型ID:在后台的“核心” -> “内容模型管理”中可以查看到每个模型对应的ID。
- 普通文章:
channelid='1' - 图集:
channelid='2' - 软件或其他自定义模型:需要查看其ID。
- 普通文章:
- 作用:告诉子列表要去哪个数据表里取数据,如果调用的是普通文章,通常可以省略,因为默认就是
1,但如果调用的是图集或其他模型,则必须指定。
实战案例:热门文章下的相关文章
这是一个非常经典和实用的嵌套场景。
需求: 在首页显示“热门文章”列表(父列表),每条热门文章下方,再显示与该文章“关键词”相关的其他文章(子列表)。
实现步骤:
步骤 1:确保文章有关键词
在后台发布文章时,务必填写“关键词”字段,这是实现相关文章的基础。
步骤 2:编写嵌套模板代码
将以下代码放到你想要显示此列表的模板文件中(通常是 index.htm)。
<!-- 父列表:调用热门文章 -->
{dede:arclist flag='h' row='5' titlelen='40'}
<div class="hot-news-item">
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p class="summary">[field:description function='cn_substr(@me, 100)'/]...</p>
<!-- 子列表:调用当前文章的相关文章 -->
{dede:arclist
addfields='keywords'
channelid='1'
row='3'
titlelen='20'
keyword='[field:keywords/]'}
<div class="related-news">
<h4>相关文章</h4>
<ul>
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
<!-- {dede:arclist} 会循环3次,显示3条相关文章 -->
</ul>
</div>
{/dede:arclist}
</div>
{/dede:arclist}
代码解析:
-
父列表
{dede:arclist flag='h' row='5'...}:flag='h':调用带有“头条”属性的文章(即热门文章)。row='5':只显示5条热门文章。[field:title/]和[field:arcurl/]:这是父列表的变量,代表当前这条热门文章的标题和链接。
-
子列表
{dede:arclist addfields='keywords'...}:addfields='keywords':这是最关键的一步!它告诉子列表:“请把父列表当前文章的keywords字段值拿过来,变成你可以用的变量。”channelid='1':指定子列表调用的是“普通文章”模型的数据。keyword='[field:keywords/]:这是子列表的查询条件,它的意思是“用从父列表传过来的keywords值作为关键词,去文章表中查找包含这些关键词的文章”。row='3':每个父条目下,只显示3条相关文章。[field:title/]和[field:arcurl/]:这里的[field:*]是子列表自己的循环变量,代表当前正在循环的“相关文章”的标题和链接,它们与父列表的变量不冲突。
常见问题与注意事项
- 变量冲突:忘记使用
addfields,导致内外层[field:title]混淆,这是90%的错误来源。 channelid错误:调用图集、软件等模型时,没有指定正确的channelid,导致调用不到数据或调用错乱。- 性能问题:嵌套
arclist会对数据库进行多次查询,如果父列表row值很大(比如20),每个父条目下再调用5个子条目,那么总共会产生20 * 5 = 100次查询(实际是1 + 20 = 21次查询,但循环次数多),这会对服务器造成较大压力。请谨慎使用,避免在大流量页面上进行深度嵌套。 - 关键词为空:如果父列表的文章没有填写关键词,
keyword=''将查询不到任何结果,子列表区域会空白。 - 循环次数控制:合理使用
row属性来控制父列表和子列表的显示数量,避免页面过长。 - 命名空间隔离:从织梦V5.6开始,官方推荐使用
[field:全局变量名/]的方式来明确指定变量来源,以增强代码可读性和避免潜在冲突,在子列表中明确写成[field:子列表标题/]虽然语法不支持,但理解这个概念很重要——addfields就是创建了一个新的命名空间。
进阶用法
除了 addfields,你还可以结合其他 arclist 属性实现更复杂的嵌套:
- 按栏目嵌套:
{dede:arclist typeid='top' row='5'} <!-- 调用顶级栏目下的文章 --> <div> <h3>[field:typename/]</h3> <!-- 注意:这里要用[field:typename/]显示栏目名 --> {dede:arclist addfields='typeid' channelid='1' row='5' typeid='[field:typeid/]'}> <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist} </div> {/dede:arclist}注意:这种方式需要确保父列表能获取到
typeid字段,并且子列表用typeid='[field:typeid/]'来指定栏目ID。
织梦 arclist 嵌套的核心就是 “数据传递” 和 “作用域隔离”。
- 数据传递:通过
addfields将父列表条目的特定字段(如keywords,typeid)传递给子列表。 - 作用域隔离:子列表通过
channelid确定数据源,并通过keyword或typeid等属性利用传递来的数据进行查询,从而在各自的循环中使用独立的[field:*]变量。
掌握 addfields 和 channelid 的用法,你就能灵活应对绝大多数需要复杂列表布局的织梦开发需求。
