核心概念:{dede:channel} 标签是什么?
{dede:channel} 是一个列表类的标签,它的主要作用是获取并输出一个频道(栏目)列表。

你可以把它想象成一个“导航菜单生成器”,它会从你的网站后台读取栏目(频道)数据,然后根据你设定的模板格式,在页面上生成一个栏目列表,比如主导航、侧边栏的“相关栏目”、“子栏目”等。
核心属性:typeid 是什么?
typeid 是 {dede:channel} 标签中最重要、最常用的一个属性,它的作用是指定从哪个栏目开始获取其子栏目列表。
typeid 的关键点:
-
默认值:
{dede:channel}标签不写typeid属性,那么它会默认获取网站根目录下的所有一级栏目,这通常用于生成网站的主导航菜单。 -
指定栏目:如果你给
typeid赋值,typeid='3',那么它会获取栏目 ID 为 3 的所有直接子栏目。
(图片来源网络,侵删) -
如何获取栏目 ID?
- 登录 DedeCMS 后台。
- 进入【核心】 -> 【栏目管理】。
- 将鼠标悬停在任何一行栏目上,浏览器左下角会显示该栏目的链接,如
dede/catalog_add.php?cid=3,其中的3就是这个栏目的 ID。
typeid 的不同用法与示例
让我们通过几个常见的场景来理解 typeid 的强大之处。
示例 1:生成主导航(不使用 typeid)
这是最基本、最常见的用法,用于显示网站最顶部的导航菜单。
场景:获取所有顶级栏目。

模板代码:
{dede:channel type='top'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码解析:
{dede:channel type='top'}:type='top'明确表示获取顶级栏目,即使不写typeid,type='top'也能达到同样的效果,并且更清晰。[field:typelink/]:调用栏目的链接地址。https://www.yoursite.com/plus/list.php?tid=1。[field:typename/]:调用栏目的名称,首页”、“产品中心”、“新闻资讯”。
示例 2:生成“关于我们”下的子栏目列表
场景:网站有一个“关于我们”栏目(假设其 ID 为 2),它下面有“公司简介”、“发展历程”、“企业文化”等子栏目,现在要在“关于我们”页面的侧边栏显示这些子栏目。
模板代码:
<h3>关于我们</h3>
<ul>
{dede:channel typeid='2'}
<li><a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
代码解析:
typeid='2':这是关键!它告诉标签:“不要管别的,我只关心 ID 为 2 的栏目的子们”。- 输出结果将只包含“公司简介”、“发展历程”等“关于我们”的直接子栏目。
示例 3:生成当前栏目的同级栏目(“相关栏目”)
场景:在文章详情页或列表页,用户可能还想看同栏目下的其他文章,这时需要显示与当前栏目平级的栏目列表。
实现方法:使用 DedeCMS 的全局变量 typeid。
模板代码:
<h3>相关栏目</h3>
<ul>
{dede:channel typeid='~typeid~'}
<li><a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
代码解析:
-
typeid='~typeid~':这里的~typeid~是一个全局变量,当这个模板被调用时(比如在文章页),~typeid~会自动被替换为当前所在栏目的 ID。 -
如果当前正在浏览“公司简介”(假设其父栏目是“关于我们”,ID为2,而“公司简介”自身ID为5),
typeid='~typeid~'就等同于typeid='5'。{dede:channel}默认获取的是子栏目,而“公司简介”没有子栏目,所以这会输出一个空列表。 -
修正(获取同级栏目的正确方法):要获取同级栏目,需要结合
reid属性和son或top类型,更推荐使用son或top结合reid。正确获取同级栏目的代码:
{dede:channel type='son' reid='~typeid~'} <li><a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a></li> {/dede:channel}type='son':表示获取子栏目。reid='~typeid~':reid指的是“父栏目ID”。~typeid~是当前栏目ID,它的父栏目ID就是我们要找的同级栏目的“父ID”,这样就能准确获取到同级栏目了。
更简单的方法(如果确定顶级栏目):
{dede:channel type='top' row='10'} <li><a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a></li> {/dede:channel}如果你的网站结构不深,直接调用顶级栏目也是一种常见的“相关栏目”展示方式。
{dede:channel} 的其他常用属性
| 属性名 | 说明 | 示例 |
|---|---|---|
typeid |
指定要获取的栏目ID,默认为顶级栏目。 | typeid='3' |
type |
栏目类型。top (顶级), son (子栏目), self (同级及子栏目)。 |
type='son' |
reid |
父栏目ID,与 type='son' 配合使用来获取指定父栏目的子栏目(即同级栏目)。 |
reid='2' |
row |
调用条数,即显示多少个栏目。 | row='8' |
col |
分多少列显示。 | col='4' |
currentstyle |
当前栏目高亮样式,非常实用! | currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>" |
实战案例:带高亮的导航菜单
这是一个非常实用的例子,展示了如何结合 typeid 和 currentstyle 实现当前栏目在导航菜单中高亮显示。
场景:主导航,当用户在“产品中心”页面时,“产品中心”这一项应该有不同的样式。
模板代码:
<nav>
<ul class="main-nav">
{dede:channel type='top' currentstyle="<li class='active'><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</nav>
代码解析:
{dede:channel type='top' ...}:循环输出所有顶级栏目。currentstyle="...":这个属性定义了一个模板字符串。- 当循环到的当前栏目与页面所在栏目**或其子栏目**匹配时,DedeCMS 就会用这个模板来渲染这一项。
~typelink~和~typename~是currentstyle中的特殊变量,会被替换成对应栏目的链接和名称。class='thisclass'是 DedeCMS 默认添加的当前栏目样式类,你也可以自定义,如class='active'。
- 最终效果:
- 如果用户在首页,导航会正常渲染。
- 如果用户进入了“产品中心”或其下的任何子栏目(如“产品A”),导航栏中“产品中心”这一项的 HTML 代码就会变成:
<li class="active"><a href="/plus/list.php?tid=3" class="thisclass">产品中心</a></li>
- 这样你就可以通过 CSS (
.active { color: #ff0000; }) 来实现高亮效果。
| 你的需求 | 应该如何写 {dede:channel} |
|---|---|
| 获取所有顶级栏目(主导航) | {dede:channel type='top'} 或 {dede:channel} |
| 获取某个栏目(ID=5)的直接子栏目 | {dede:channel typeid='5'} |
| 获取当前栏目的同级栏目 | {dede:channel type='son' reid='~typeid~'} |
| 获取当前栏目的所有下级栏目(包括多级) | {dede:channel type='self' typeid='~typeid~'} |
| 调用顶级栏目,并限制数量为5个 | {dede:channel type='top' row='5'} |
| 调用顶级栏目,并给当前栏目高亮 | {dede:channel type='top' currentstyle='...'} |
掌握 typeid 的用法是玩转 DedeCMS 模板的第一步,多加练习和尝试不同的组合,你就能轻松构建出各种复杂的栏目列表了。
