最基础的导航调用:channelartlist
这是调用顶级栏目(一级导航)最常用、最强大的标签,它会循环输出所有顶级栏目,并且可以在循环内调用其子栏目。
(图片来源网络,侵删)
基本语法和参数
{dede:channelartlist type='top' row='8'}
<li>
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
{dede:channel type='son' noself='yes'}
<a href="[field:typelink/]">[field:typename/]</a>
{dede:channel}
</li>
{/dede:channelartlist}
参数详解
type='top': 指定调用顶级栏目,这是最常用的参数。
row='8': 指定调用栏目的数量,例如只显示前8个导航。
currentstyle='active': 指定当前栏目高亮的样式名,这个样式名会自动被添加到 <li> 标签的 class 属性中。
typeid='1': 指定调用某个特定的顶级栏目及其子栏目,如果留空,则调用所有顶级栏目。
字段说明 (在 {dede:channelartlist} 内部使用)
{dede:field name='typename'/}: 获取当前顶级栏目的名称。
{dede:field name='typeurl'/}: 获取当前顶级栏目的链接地址。
{dede:field name='id'/}: 获取当前顶级栏目的 ID。
在 channelartlist 中调用子栏目
这是 channelartlist 的核心优势,它使用一个嵌套的 {dede:channel} 标签来调用当前顶级栏目下的所有子栏目。
示例代码(带当前栏目高亮和子栏目)
<ul class="main-nav">
{dede:channelartlist type='top' row='8' currentstyle='class="current"'}
<li class="{dede:field name='typeid' function='IsPart(@me, $typeid)'}">
<a href="{dede:field name='typeurl'/}" {dede:field name='typeid' function='IsPart(@me, $typeid)'}>{dede:field name='typename'/}</a>
{dede:channel type='son' noself='yes'}
<div class="sub-nav">
<a href="[field:typelink/]">[field:typename/]</a>
</div>
{dede:channel}
</li>
{dede:channelartlist}
</ul>
代码解析:
{dede:channelartlist} ... {/dede:channelartlist}: 循环输出所有顶级栏目。
currentstyle='class="current"': 当访问的页面属于某个顶级栏目时,<li> 标签会自动带上 class="current" 属性,如果当前页面是“产品介绍”下的“产品A”,产品介绍”这个 <li> 就会有 class="current"。
{dede:channel type='son' noself='yes'} ... {/dede:channel}:
type='son': 表示调用子栏目。
noself='yes': 表示不调用栏目本身,只调用子栏目。
[field:typelink/]: 子栏目的链接。
[field:typename/]: 子栏目的名称。
function='IsPart(@me, $typeid)': 这是一个非常重要的自定义函数,用于判断当前页面是否属于某个栏目。$typeid 是当前页面的栏目ID,这个函数会返回 class='current' 字符串,实现更精确的高亮。
调用指定栏目的子导航
有时候我们只想在某个特定页面(比如首页)调用某个固定栏目的子导航,而不是所有顶级栏目的子导航。
示例:在首页调用 ID 为 2 的栏目的所有子栏目
在首页模板 (index.htm) 中,你可以这样写:
(图片来源网络,侵删)
{dede:channelartlist typeid='2'}
<h2>{dede:field name='typename'/}</h2>
<ul>
{dede:channel type='son' noself='yes'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{dede:channel}
</ul>
{/dede:channelartlist}
说明:
typeid='2': 这里指定了只调用 ID 为 2 的顶级栏目。
- 外层的
{dede:channelartlist} 只是为了获取父栏目名称和提供一个上下文,如果不需要父栏目名称,可以简化调用。
更简洁的写法(直接调用子栏目):
如果你明确知道父栏目的ID,可以直接使用 {dede:channel} 标签,但需要配合 reid 参数。
{dede:channel type='son' reid='2' row='10'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
参数说明:
(图片来源网络,侵删)
type='son': 调用子栏目。
reid='2': 指定父栏目的ID,这里的 reid 是相对于当前栏目的父级ID。
常见问题与解决方案 (FAQ)
问题1:为什么我的导航调用不出来?
- 检查栏目设置: 进入后台“[核心]-[栏目管理]”,检查你的栏目是否正确设置,栏目类型”是否为“栏目”(而不是“外部链接”或“单页”)。
- 检查模板标签: 确保标签拼写正确,没有遗漏
{dede:} 或 {/dede:}。
- 检查缓存: DedeCMS 有强大的缓存机制,调用不出来时,尝试在后台“[系统]-[清除缓存]”中清除所有缓存,然后刷新页面。
问题2:为什么当前栏目没有高亮?
currentstyle 参数未设置: 确保你的标签里加了 currentstyle 参数,currentstyle='class="on"'。
- 高亮逻辑错误: 如果你手动判断,请确保你的 PHP 函数(如
IsPart)逻辑正确。currentstyle 是最简单可靠的方法。
- 页面不属于任何栏目: 如果你访问的是首页,而首页没有关联到任何栏目,顶级导航自然不会高亮,我们会将首页设置为“不显示在导航中”,或者为首页设置一个特殊的样式。
问题3:为什么子导航只显示一个?
- 检查
row 参数: 你可能在 {dede:channel} 标签里误加了 row='1',导致只调用一个子栏目,如果需要调用所有子栏目,请删除 row 参数。
问题4:如何实现“首页”导航,并且高亮?
首页的导航高亮逻辑比较特殊,因为它不属于任何一个栏目。
手动添加首页导航,并用JS控制
<ul class="nav">
<li><a href="{dede:global.cfg_basehost/}" id="nav-home">首页</a></li>
{dede:channelartlist type='top' row='8' currentstyle='class="current"'}
<li><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></li>
{/dede:channelartlist}
</ul>
<script>
// 获取当前页面的URL
var currentUrl = window.location.href;
// 获取首页链接
var homeUrl = "{dede:global.cfg_basehost/}";
if (currentUrl == homeUrl || currentUrl == homeUrl + "/") {
document.getElementById("nav-home").className = "current";
}
</script>
在模板里用PHP判断(更推荐)
在模板文件中,你可以使用 DedeCMS 的全局变量 $typeid 来判断。
<ul class="nav">
<li><a href="{dede:global.cfg_basehost/}">首页</a></li>
{dede:channelartlist type='top' row='8' currentstyle='class="current"'}
<li><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></li>
{/dede:channelartlist}
</ul>
<style>
/* 默认首页高亮 */
#nav-home.current { background-color: #f00; }
</style>
<script>
<?php
// 如果当前页面是首页,则给首页的li添加current类
if ($GLOBALS['typeid'] == 0) {
echo "document.getElementById('nav-home').className = 'current';";
}
?>
</script>
需求场景
推荐标签
关键参数/用法
调用所有顶级导航
{dede:channelartlist}
type='top', row='N', currentstyle
顶级导航带子导航
{dede:channelartlist} + {dede:channel type='son'}
currentstyle 用于高亮父级,[field:typelink/] 调用子级
调用指定栏目的子导航
{dede:channelartlist typeid='N'}
typeid 指定父栏目ID
调用指定栏目的子导航(简化版)
{dede:channel type='son' reid='N'}
reid 指定父栏目ID
首页导航高亮
手动添加 <a> 标签 + JS/PHP判断
通过 $typeid == 0 判断是否为首页
希望这份详细的指南能帮助你彻底解决 DedeCMS 的导航调用问题!如果还有具体的问题,可以随时提出。
这是调用顶级栏目(一级导航)最常用、最强大的标签,它会循环输出所有顶级栏目,并且可以在循环内调用其子栏目。

(图片来源网络,侵删)
基本语法和参数
{dede:channelartlist type='top' row='8'}
<li>
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
{dede:channel type='son' noself='yes'}
<a href="[field:typelink/]">[field:typename/]</a>
{dede:channel}
</li>
{/dede:channelartlist}
参数详解
type='top': 指定调用顶级栏目,这是最常用的参数。row='8': 指定调用栏目的数量,例如只显示前8个导航。currentstyle='active': 指定当前栏目高亮的样式名,这个样式名会自动被添加到<li>标签的 class 属性中。typeid='1': 指定调用某个特定的顶级栏目及其子栏目,如果留空,则调用所有顶级栏目。
字段说明 (在 {dede:channelartlist} 内部使用)
{dede:field name='typename'/}: 获取当前顶级栏目的名称。{dede:field name='typeurl'/}: 获取当前顶级栏目的链接地址。{dede:field name='id'/}: 获取当前顶级栏目的 ID。
在 channelartlist 中调用子栏目
这是 channelartlist 的核心优势,它使用一个嵌套的 {dede:channel} 标签来调用当前顶级栏目下的所有子栏目。
示例代码(带当前栏目高亮和子栏目)
<ul class="main-nav">
{dede:channelartlist type='top' row='8' currentstyle='class="current"'}
<li class="{dede:field name='typeid' function='IsPart(@me, $typeid)'}">
<a href="{dede:field name='typeurl'/}" {dede:field name='typeid' function='IsPart(@me, $typeid)'}>{dede:field name='typename'/}</a>
{dede:channel type='son' noself='yes'}
<div class="sub-nav">
<a href="[field:typelink/]">[field:typename/]</a>
</div>
{dede:channel}
</li>
{dede:channelartlist}
</ul>
代码解析:
{dede:channelartlist} ... {/dede:channelartlist}: 循环输出所有顶级栏目。currentstyle='class="current"': 当访问的页面属于某个顶级栏目时,<li>标签会自动带上class="current"属性,如果当前页面是“产品介绍”下的“产品A”,产品介绍”这个<li>就会有class="current"。{dede:channel type='son' noself='yes'} ... {/dede:channel}:type='son': 表示调用子栏目。noself='yes': 表示不调用栏目本身,只调用子栏目。[field:typelink/]: 子栏目的链接。[field:typename/]: 子栏目的名称。
function='IsPart(@me, $typeid)': 这是一个非常重要的自定义函数,用于判断当前页面是否属于某个栏目。$typeid是当前页面的栏目ID,这个函数会返回class='current'字符串,实现更精确的高亮。
调用指定栏目的子导航
有时候我们只想在某个特定页面(比如首页)调用某个固定栏目的子导航,而不是所有顶级栏目的子导航。
示例:在首页调用 ID 为 2 的栏目的所有子栏目
在首页模板 (index.htm) 中,你可以这样写:

(图片来源网络,侵删)
{dede:channelartlist typeid='2'}
<h2>{dede:field name='typename'/}</h2>
<ul>
{dede:channel type='son' noself='yes'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{dede:channel}
</ul>
{/dede:channelartlist}
说明:
typeid='2': 这里指定了只调用 ID 为 2 的顶级栏目。- 外层的
{dede:channelartlist}只是为了获取父栏目名称和提供一个上下文,如果不需要父栏目名称,可以简化调用。
更简洁的写法(直接调用子栏目):
如果你明确知道父栏目的ID,可以直接使用 {dede:channel} 标签,但需要配合 reid 参数。
{dede:channel type='son' reid='2' row='10'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
参数说明:

(图片来源网络,侵删)
type='son': 调用子栏目。reid='2': 指定父栏目的ID,这里的reid是相对于当前栏目的父级ID。
常见问题与解决方案 (FAQ)
问题1:为什么我的导航调用不出来?
- 检查栏目设置: 进入后台“[核心]-[栏目管理]”,检查你的栏目是否正确设置,栏目类型”是否为“栏目”(而不是“外部链接”或“单页”)。
- 检查模板标签: 确保标签拼写正确,没有遗漏
{dede:}或{/dede:}。 - 检查缓存: DedeCMS 有强大的缓存机制,调用不出来时,尝试在后台“[系统]-[清除缓存]”中清除所有缓存,然后刷新页面。
问题2:为什么当前栏目没有高亮?
currentstyle参数未设置: 确保你的标签里加了currentstyle参数,currentstyle='class="on"'。- 高亮逻辑错误: 如果你手动判断,请确保你的 PHP 函数(如
IsPart)逻辑正确。currentstyle是最简单可靠的方法。 - 页面不属于任何栏目: 如果你访问的是首页,而首页没有关联到任何栏目,顶级导航自然不会高亮,我们会将首页设置为“不显示在导航中”,或者为首页设置一个特殊的样式。
问题3:为什么子导航只显示一个?
- 检查
row参数: 你可能在{dede:channel}标签里误加了row='1',导致只调用一个子栏目,如果需要调用所有子栏目,请删除row参数。
问题4:如何实现“首页”导航,并且高亮?
首页的导航高亮逻辑比较特殊,因为它不属于任何一个栏目。
手动添加首页导航,并用JS控制
<ul class="nav">
<li><a href="{dede:global.cfg_basehost/}" id="nav-home">首页</a></li>
{dede:channelartlist type='top' row='8' currentstyle='class="current"'}
<li><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></li>
{/dede:channelartlist}
</ul>
<script>
// 获取当前页面的URL
var currentUrl = window.location.href;
// 获取首页链接
var homeUrl = "{dede:global.cfg_basehost/}";
if (currentUrl == homeUrl || currentUrl == homeUrl + "/") {
document.getElementById("nav-home").className = "current";
}
</script>
在模板里用PHP判断(更推荐)
在模板文件中,你可以使用 DedeCMS 的全局变量 $typeid 来判断。
<ul class="nav">
<li><a href="{dede:global.cfg_basehost/}">首页</a></li>
{dede:channelartlist type='top' row='8' currentstyle='class="current"'}
<li><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></li>
{/dede:channelartlist}
</ul>
<style>
/* 默认首页高亮 */
#nav-home.current { background-color: #f00; }
</style>
<script>
<?php
// 如果当前页面是首页,则给首页的li添加current类
if ($GLOBALS['typeid'] == 0) {
echo "document.getElementById('nav-home').className = 'current';";
}
?>
</script>
| 需求场景 | 推荐标签 | 关键参数/用法 |
|---|---|---|
| 调用所有顶级导航 | {dede:channelartlist} |
type='top', row='N', currentstyle |
| 顶级导航带子导航 | {dede:channelartlist} + {dede:channel type='son'} |
currentstyle 用于高亮父级,[field:typelink/] 调用子级 |
| 调用指定栏目的子导航 | {dede:channelartlist typeid='N'} |
typeid 指定父栏目ID |
| 调用指定栏目的子导航(简化版) | {dede:channel type='son' reid='N'} |
reid 指定父栏目ID |
| 首页导航高亮 | 手动添加 <a> 标签 + JS/PHP判断 |
通过 $typeid == 0 判断是否为首页 |
希望这份详细的指南能帮助你彻底解决 DedeCMS 的导航调用问题!如果还有具体的问题,可以随时提出。
