核心思路
无论使用哪种方法,核心思路都是:

- 获取当前栏目的ID:这是所有操作的基础,DedeCMS 有一个全局变量
{dede:field.id/}可以直接获取。 - 根据当前栏目ID查询其子栏目:使用 DedeCMS 的标签(如
channel、arclist)或PHP代码,通过topid或reid参数来筛选出属于当前栏目的子栏目。 - 显示子栏目信息:循环输出子栏目的名称、链接、封面图、简介等信息。
使用 {dede:channel} 标签(最常用)
这是最标准、最推荐的方法,专门用于调用栏目列表。
代码示例
{dede:channel type='son' typeid='{dede:field.id/}'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码详解
{dede:channel ...}:这是 DedeCMS 调用栏目的核心标签。type='son':关键参数,表示调用“子栏目”,如果不写这个参数,默认会调用顶级栏目。typeid='{dede:field.id/}':关键参数,指定要查询哪个栏目的子栏目。{dede:field.id/}是一个变量,它会自动获取当前页面的栏目ID,如果当前栏目ID是5,那么这个标签实际就变成了typeid='5'。[field:typelink/]:子栏目的链接地址。[field:typename/]:子栏目的名称。
完整示例(带样式和循环)
假设我们想在当前栏目页的侧边栏显示一个子栏目列表,并给每个子栏目加上 这是 如果你的需求比较复杂,比如需要判断子栏目是否存在,或者需要调用额外的自定义字段,使用PHP代码会更方便。 对于99%的需求,直接使用 方法一 (li
<div class="sub-category">
<h3>子栏目列表</h3>
<ul>
{dede:channel type='son' typeid='{dede:field.id/}'}
<li><a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
使用
{dede:arclist} 标签(灵活,可调用栏目文章)arclist 标签主要用于调用文章列表,但它也可以用来调用栏目信息,并且非常灵活,可以调用子栏目下的文章。代码示例(调用子栏目列表本身)
{dede:arclist typeid='{dede:field.id/}' channelid='1' row='10'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:arclist}
代码详解
typeid='{dede:field.id/}':指定要查询的父栏目ID(即当前栏目ID)。channelid='1':关键参数,指定要调用的模型ID。1 代表“栏目目录”模型,如果你想调用某个特定栏目模型(如“产品”模型)的子栏目,就需要填写对应的模型ID。row='10':表示最多显示10个子栏目。代码示例(调用子栏目下的文章)
arclist 标签更强大的地方,可以一次性列出所有子栏目及其最新文章。{dede:arclist typeid='{dede:field.id/}' row='8' titlelen='30'}
<li>
<span class="title">[field:title/]</span>
<span class="cat"><a href="[field:typelink/]">[field:typename/]</a></span>
</li>
{/dede:arclist}
[field:title/] 调用的是子栏目下文章的标题,[field:typelink/] 和 [field:typename/] 调用的是该文章所属的子栏目的链接和名称。
使用PHP代码(最灵活,适合复杂逻辑)

代码示例
<?php
// 获取当前栏目的ID
$typeid = $GLOBALS['typeid'];
// 调用DedeCMS的函数获取子栏目
// GetSonIds函数可以获取指定ID下的所有子栏目ID(包括孙栏目),这里我们只取一级
// 使用channelartlist标签配合SQL查询可以更精确地获取一级子栏目
$dsql = new DedeSql(false);
$sql = "SELECT id,typename,typedir FROM `dede_arctype` WHERE reid='$typeid' AND ishidden<>1 ORDER BY sortrank ASC";
$dsql->SetQuery($sql);
$dsql->Execute();
if($dsql->GetTotalRow() > 0){
echo "<ul class='sub-category-list'>";
while($row = $dsql->GetArray()){
$typelink = GetOneTypeUrlA($row);
echo "<li><a href='".$typelink['typeurl']."'>".$row['typename']."</a></li>";
}
echo "</ul>";
}else{
echo "<p>该栏目暂无子栏目。</p>";
}
$dsql->Close();
?>
代码详解
$typeid = $GLOBALS['typeid'];:获取当前栏目的ID,与方法一中的 {dede:field.id/} 效果相同。new DedeSql(false);:创建一个数据库操作对象。$sql = "SELECT ...";:编写SQL查询语句。
dede_arctype:DedeCMS中存储栏目的数据表(表名可能前缀不同,如#@_arctype)。reid='$typeid':关键条件,reid 字段存储的是栏目的“父栏目ID”,这里用它来筛选出当前栏目ID下的所有子栏目。ishidden<>1:排除被隐藏的栏目。ORDER BY sortrank ASC:按后台设置的排序进行升序排列。while($row = $dsql->GetArray()){...}:循环查询结果。GetOneTypeUrlA($row);:这是一个DedeCMS内置函数,用于根据栏目信息数组生成完整的栏目链接地址。if($dsql->GetTotalRow() > 0){...}:判断是否有子栏目,如果没有则显示提示信息。
总结与推荐
方法
优点
缺点
适用场景
{dede:channel}最标准、最简单、代码可读性强、效率高。
功能相对单一,主要用于调用栏目本身。
绝大多数情况下的首选,特别是只需要显示子栏目名称和链接时。
{dede:arclist}非常灵活,不仅可以调用栏目,还能调用子栏目下的内容。
参数相对复杂,需要了解
channelid 等参数。需要在列表页同时显示子栏目及其最新文章等混合内容时。
PHP代码
功能最强大,可以实现任何复杂的逻辑判断和数据处理。
需要一定的PHP和SQL基础,代码量稍多。
需要调用自定义字段、进行复杂判断(如判断子栏目是否存在后再显示)等高级需求。
{dede:channel}) 就完全足够了,也是官方推荐的最佳实践。
