- 找到顶级栏目的 ID。
- 使用带有顶级栏目 ID 条件的
{dede:channel}标签进行调用。
下面我将为您提供几种最常用和最实用的方法,并附上详细的代码解释。

(图片来源网络,侵删)
准备工作:如何找到顶级栏目 ID?
在编写代码之前,您必须先知道您要调用的那个“顶级栏目”的 ID 是多少。
- 登录您的 DedeCMS 后台。
- 进入【核心】 -> 【栏目管理】。
- 找到您想要调用的那个顶级栏目(产品展示”)。
- 将鼠标光标移动到该栏目名称上,在浏览器左下角的状态栏会显示该栏目的编辑链接,
.../catalog_add.php?cid=1。 - 这个
cid=1中的1就是这个顶级栏目的 ID,请记下这个 ID。
最常用的方法(推荐)
这是最直接、最常用的方法,直接在模板文件中使用 {dede:channel} 标签,并通过 topid 和 reid 参数来指定。
标签代码
{dede:channel type='son' typeid='这里填入顶级栏目ID'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码详解
{dede:channel}:这是 DedeCMS 调用栏目的核心标签。typeid='这里填入顶级栏目ID':这是关键,将您准备工作中找到的顶级栏目 ID 填到这里,它告诉系统从哪个栏目开始查找其子栏目。type='son':这个参数指定了调用的类型。son:表示调用当前栏目(由typeid指定)的直接子栏目(即二级栏目)。self:表示调用当前栏目本身。top:表示调用顶级栏目。
[field:typelink/]:这是栏目链接的单标签,会输出该二级栏目的完整网址。[field:typename/]:这是栏目名称的单标签,会输出该二级栏目的名称。
完整示例
假设您的“产品展示”顶级栏目 ID 是 2,您想在首页的某个位置调用它的所有二级栏目,代码可以这样写:
<div class="product-categories">
<h3>产品分类</h3>
<ul>
{dede:channel type='son' typeid='2'}
<li><a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
这段代码会生成一个类似这样的 HTML 列表:

(图片来源网络,侵删)
<div class="product-categories">
<h3>产品分类</h3>
<ul>
<li><a href="/plus/list.php?tid=5" title="手机">手机</a></li>
<li><a href="/plus/list.php?tid=6" title="电脑">电脑</a></li>
<li><a href="/plus/list.php?tid=7" title="相机">相机</a></li>
</ul>
</div>
使用 reid 参数(效果相同)
reid 参数的含义是“父栏目ID”,它与 typeid 的 son 类型在效果上是等价的,您可以选择自己觉得更直观的一种。
标签代码
{dede:channel type='son' reid='这里填入顶级栏目ID'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码详解
reid='这里填入顶级栏目ID':这里的reid指定了父栏目的 ID,系统会查找所有reid等于这个值的栏目,也就是它的子栏目。type='son':在这里可以省略,因为reid参数本身就隐含了查找子栏目的意思,但为了代码清晰,建议保留。
调用顶级栏目下的所有栏目(包括二级、三级...)
如果您不仅仅是想调用二级栏目,而是想调用顶级栏目下的所有层级的子栏目(“产品展示”下的“手机”、“电脑”,以及“手机”下的“智能手机”、“功能机”),可以使用 type='sun' 参数。
标签代码
{dede:channel type='sun' typeid='这里填入顶级栏目ID'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码详解
type='sun':sun是 "son" 的扩展,表示“所有子孙栏目”,会递归地查找所有层级的子栏目。
进阶:调用带封面文章的二级栏目
我们希望调用的二级栏目列表,每个栏目项都包含一张封面图片,这需要结合 {dede:arclist} 标签来实现。
标签代码
{dede:channel type='son' typeid='这里填入顶级栏目ID'}
<dl>
<dt>
<a href="[field:typelink/]">
<img src="[field:typedir function='str_replace("{cmspath}","",@me)'/images/defaultpic.jpg']" alt="[field:typename/]" />
</a>
</dt>
<dd>
<a href="[field:typelink/]">[field:typename/]</a>
</dd>
</dl>
{/dede:channel}
代码详解
这里的关键在于如何获取栏目的封面图,DedeCMS 的栏目本身不直接存储封面图路径,但有一个通用方法:

(图片来源网络,侵删)
- 约定存放位置:我们会将栏目的封面图命名为
pic.jpg或cover.jpg,并放在该栏目对应的目录下的images文件夹中。 - 构造路径:
[field:typedir/]:获取栏目的目录路径,/a/product/phone。function='str_replace("{cmspath}","",@me)':这是一个自定义函数,用于去除路径中的{cmspath}变量,得到相对于网站根目录的路径。'/images/defaultpic.jpg':这是默认图片的路径,如果栏目目录下没有pic.jpg,则显示这个默认图。- 最终路径:
[field:typedir function='str_replace("{cmspath}","",@me)'/images/pic.jpg']会生成类似/a/product/phone/images/pic.jpg这样的路径。
注意:此方法的前提是您已经为每个二级栏目上传了封面图,并且遵循了上述的命名和存放规则。
| 需求 | 推荐标签 | 代码示例 |
|---|---|---|
| 调用指定顶级栏目的二级栏目 | {dede:channel type='son' typeid='ID'} |
{dede:channel type='son' typeid='2'}<a href="[field:typelink/]">[field:typename/]</a>{/dede:channel} |
| 调用指定顶级栏目的所有子孙栏目 | {dede:channel type='sun' typeid='ID'} |
{dede:channel type='sun' typeid='2'}... |
| 调用带封面图的二级栏目 | {dede:channel} + 自定义图片路径 |
{dede:channel type='son' typeid='2'}<img src="[field:typedir function='str_replace("{cmspath}","",@me)'/images/pic.jpg']" />...{/dede:channel} |
希望这些详细的解释和示例能帮助您完美地解决问题!
