下面我将为你提供最常用、最标准的实现方法,并附上详细的代码解释和注意事项。

(图片来源网络,侵删)
核心思路
这个功能的实现逻辑是“循环套循环”:
- 第一层循环:调用并循环你指定的二级栏目。
- 第二层循环:在每一个二级栏目下,调用并循环它的所有三级子栏目。
- 第三层循环:在每一个三级栏目下,调用并循环它的文章列表(只获取文章标题)。
标准嵌套循环法(推荐)
这是最清晰、最容易理解的方法,适合大多数场景。
场景假设
假设你的网站结构如下:
- 一级栏目:
网站首页 - 二级栏目:
产品中心(ID假设为 2)- 三级栏目:
智能手机(ID假设为 5)文章:iPhone 15 发布、华为 Mate 60 Pro 评测
(图片来源网络,侵删) - 三级栏目:
笔记本电脑(ID假设为 6)文章:ThinkPad 新品、MacBook Pro 性能测试
- 三级栏目:
- 二级栏目:
新闻资讯(ID假设为 3)- 三级栏目:
公司动态(ID假设为 7)文章:公司乔迁、年会圆满结束
- 三级栏目:
行业新闻(ID假设为 8)文章:2025年科技趋势报告
- 三级栏目:
我们的目标是在页面上展示“产品中心”下的所有三级栏目及其文章。

(图片来源网络,侵删)
完整代码示例
将以下代码放置到你需要显示这个列表的模板文件中(通常是 index.htm 或其他自定义的栏目模板)。
{dede:channel type='son' typeid='2'}
<dl>
<dt><a href="[field:typelink/]">[field:typename/]</a></dt>
<dd>
<!-- 第二层循环:循环当前二级栏目下的所有三级栏目 -->
{dede:channel type='son' currentstyle=''}
<div class="third-category">
<h3><a href="[field:typelink/]">[field:typename/]</a></h3>
<ul>
<!-- 第三层循环:循环当前三级栏目下的文章列表 -->
{dede:arclist titlelen='42' row='5'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<span class="art_date">[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:arclist}
</ul>
</div>
{/dede:channel}
</dd>
</dl>
{/dede:channel}
代码逐行详解
-
{dede:channel type='son' typeid='2'}- 作用:这是第一层循环,用于获取指定的二级栏目及其所有三级子栏目。
typeid='2':这是最关键的参数,你需要将其替换为你自己的二级栏目ID,如果你想获取多个二级栏目(比如ID为2和3),可以用逗号隔开:typeid='2,3'。type='son':表示获取typeid指定栏目的所有直接子栏目(即三级栏目)。[field:typelink/]和[field:typename/]:这是二级栏目的链接和名称,但我们在这个循环里通常不会直接使用它们,因为我们的重点是它们下面的子栏目。
-
{dede:channel type='son' currentstyle=''}- 作用:这是第二层循环,嵌套在第一层循环内部,它会循环遍历由第一层获取到的每一个三级栏目。
type='son':再次使用son类型,因为第一层循环已经定位到了二级栏目,这里的son就是指向三级栏目。currentstyle='':我们留空,因为通常不需要对当前栏目进行特殊样式处理。[field:typelink/]和[field:typename/]:这里是三级栏目的链接和名称,我们用它来作为文章列表的标题。
-
{dede:arclist titlelen='42' row='5'}- 作用:这是第三层循环,用于获取并循环当前三级栏目下的文章列表。
typeid:注意,这个标签在嵌套循环中会自动继承外层{dede:channel}循环中的栏目ID,你不需要手动指定typeid,它会自动获取当前正在循环的三级栏目的ID,并调用该栏目下的文章,这是织梦标签非常智能的一点。titlelen='42':截取文章标题的长度,防止标题过长影响布局,42个半角字符(约21个汉字)。row='5':获取文章的数量,这里设置为5篇,你可以根据需要修改。[field:arcurl/]:文章链接。[field:title/]。[field:pubdate function="MyDate('Y-m-d', @me)"/]:文章发布日期,通过函数格式化为年-月-日的形式。
使用SQL查询法(更灵活)
如果你的需求非常复杂,或者需要更精确地控制数据,可以直接使用SQL查询。
{dede:sql sql="SELECT id,typename,typedir FROM `dede_arctype` WHERE reid=2 AND ishidden<>1 ORDER BY sortrank ASC"}
<dl>
<dt><a href="[field:typedir function='str_replace("{cmspath}","",$url)'/]">[field:typename/]</a></dt>
<dd>
<!-- 循环三级栏目下的文章 -->
{dede:arclist typeid='[field:id/]' titlelen='42' row='5'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{/dede:arclist}
</dd>
</dl>
{/dede:sql}
代码详解
{dede:sql ...}sql="...":直接执行SQL语句。SELECT id,typename,typedir FROM dede_arctype:从栏目表dede_arctype中查询字段。WHERE reid=2:这是核心条件。reid字段表示“父栏目ID”。reid=2就是查询父栏目ID为2的所有栏目,也就是所有三级栏目。AND ishidden<>1:排除隐藏的栏目。ORDER BY sortrank ASC:按照后台设置的排序进行升序排列。
[field:id/]:在SQL查询中获取到的id字段,也就是三级栏目的ID。[field:typedir function='str_replace("{cmspath}","",$url)'/]:typedir字段中包含了{cmspath}这样的占位符,需要用function将其替换为真实的网站路径,才能得到正确的链接。
总结与建议
| 特性 | 标准嵌套循环 | SQL查询 |
|---|---|---|
| 易用性 | 高,标签化思维,直观易懂 | 低,需要懂SQL语法 |
| 可读性 | 高,模板结构清晰 | 低,SQL语句嵌入模板中 |
| 灵活性 | 一般,受限于织梦标签的功能 | 极高,可以写任意复杂的SQL |
| 适用场景 | 90%的常规需求,强烈推荐 | 需要复杂筛选、排序或计算等高级场景 |
对于绝大多数用户来说,强烈推荐使用方法一,它不仅代码清晰,而且不容易出错,符合DedeCMS的设计哲学。
最后的小提示:在编写模板时,请务必确认你的栏目ID是否正确,这是导致调用失败最常见的原因,你可以在DedeCMS后台的【频道管理】中,鼠标悬停在栏目名称上,浏览器左下角会显示链接,其中的数字就是栏目ID。
