使用官方提供的默认标签(最简单)
这是最直接的方法,适用于大多数不需要复杂样式的场景。

(图片来源网络,侵删)
标签名称: {dede:channel}
基本用法:
{dede:channel type='top' row='10'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
参数说明:
type='top': 这是关键参数,表示只调用顶级栏目,如果省略,它会调用所有栏目。row='10': 表示调用栏目的数量,0或不写表示调用所有顶级栏目。typeid='栏目ID': 如果只想调用某个顶级栏目下的子栏目,可以指定此ID(但结合type='top'时,此参数通常用于特殊场景)。currentstyle='...': 用于高亮当前所在的栏目。
示例:高亮当前栏目

(图片来源网络,侵删)
假设你想让用户当前所在的栏目显示为红色加粗:
{dede:channel type='top' row='10' currentstyle="<a href='~typelink~' class='thisclass'><span>~typename~</span></a>"}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
~typelink~和~typename~是currentstyle中的特殊占位符,会分别被替换为当前栏目的链接和名称。class='thisclass'是一个常用的类名,你可以通过CSS来定义.thisclass的样式。
使用自定义SQL查询(最灵活)
当官方标签无法满足复杂需求时,例如需要调用特定条件的栏目、或者按特定字段排序,使用自定义SQL是最佳选择。
标签名称: {dede:sql}
基本用法:

(图片来源网络,侵删)
{dede:sql sql="SELECT id, typename, typedir FROM dede_arctype WHERE reid=0 ORDER BY id ASC"}
<a href="[field:typedir function='str_replace("{cmspath}","",$value)'/]">[field:typename/]</a>
{/dede:sql}
代码详解:
sql="...": 这里写你的SQL查询语句。SELECT id, typename, typedir: 选择你需要的字段。id是栏目ID,typename是栏目名,typedir是栏目链接(默认会包含{cmspath}变量)。FROM dede_arctype:dede_arctype是DedeCMS中存储栏目的数据表,请确认你的表前缀是否为dede_,如果不是,请相应修改。WHERE reid=0: 这是核心条件。reid字段表示“父栏目ID”,reid=0就意味着没有父栏目,即顶级栏目。ORDER BY id ASC: 按栏目ID升序排列,你也可以用ordersort排序,ORDER BY ordersort ASC。[field:typedir function='str_replace("{cmspath}","",$value)'/]: 这是处理字段值的技巧。[field:typedir/]直接输出会得到类似/plus/list.php?tid=1的链接,但有时会是{cmspath}/plus/list.php?tid=1。function='str_replace("{cmspath}","",$value)'使用PHP的str_replace函数,将{cmspath}这个字符串替换为空,确保链接正确。
结合 dede:channelartlist 调用顶级栏目及其子栏目(常用)
这是一个非常强大的组合,通常用于制作主导航栏,既能显示顶级栏目,又能高亮当前顶级栏目,并加载其下的子栏目。
标签名称: {dede:channelartlist}
基本用法:
<ul id="nav">
{dede:channelartlist typeid='top' row='10'}
<li class="{dede:field name='typeid' function='IsTop(@me)'/}">
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
{dede:channel type='son' noself='yes'}
<ul class="subnav">
<li><a href="[field:typelink/]">[field:typename/]</a></li>
</ul>
{dede:channel}
</li>
{/dede:channelartlist}
</ul>
代码详解:
-
{dede:channelartlist typeid='top' row='10'}:- 这个标签会循环遍历所有的顶级栏目。
typeid='top'指定只调用顶级栏目。- 在循环内部,
{dede:field name='typeurl'}和{dede:field name='typename'}分别指向当前顶级栏目的链接和名称。
-
{dede:channel type='son' noself='yes'}:- 这个标签被放在
{dede:channelartlist}的内部,它的作用是调用当前顶级栏目下的所有子栏目。 type='son'是关键,表示调用子栏目。noself='yes'表示不调用栏目本身(在这里就是顶级栏目本身),只调用它的子栏目。
- 这个标签被放在
-
class="{dede:field name='typeid' function='IsTop(@me)'}":- 这是一个巧妙的高亮技巧。
IsTop()是一个自定义函数(通常在include/common.func.php中定义),它会判断当前栏目是否是顶级栏目,如果是,则返回一个特定的类名(如current),否则返回空,你可以通过CSS来给这个类名设置高亮样式。
- 这是一个巧妙的高亮技巧。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:channel} |
代码最简单,官方支持 | 功能相对固定,不够灵活 | 简单的栏目列表,对样式和功能要求不高的地方。 |
{dede:sql} |
功能最强大,最灵活 | 需要懂基本的SQL语法,有一定门槛 | 需要复杂查询、按特定字段排序、或官方标签无法实现的功能。 |
{dede:channelartlist} |
结构最清晰,适合导航 | 标签嵌套,稍复杂 | 制作网站主导航,需要同时显示顶级栏目和当前栏目的子栏目。 |
给您的建议:
- 如果只是做一个简单的“关于我们”、“产品中心”这样的栏目列表,直接使用 方法一 即可。
- 如果您正在制作网站的顶部或侧边导航栏,需要包含顶级栏目和子栏目,方法三 是不二之选。
- 如果您发现方法一和方法三都无法满足您的特殊需求(只调用排序号大于5的顶级栏目),那么就果断使用 方法二。
希望这些详细的解释能帮助您在DedeCMS项目中轻松调用顶级栏目列表!
