在织梦(DedeCMS)系统中,提取二级栏目是网站开发中常见的操作,主要用于导航栏、面包屑导航或内容页面的分类展示,织梦的栏目结构采用树形层级设计,一级栏目为顶级分类,二级栏目则隶属于一级栏目之下,提取二级栏目的核心思路是通过数据库查询或调用系统标签,结合栏目ID、父级ID等字段进行筛选和输出,以下是详细的操作方法和注意事项。

通过SQL语句直接提取二级栏目
如果需要在自定义模板页面或PHP文件中获取二级栏目,可以直接执行SQL查询,织梦的栏目表(dede_arctype
)中,topid
字段表示顶级栏目的ID,reid
字段表示父级栏目的ID,二级栏目的特征是reid
不为0且topid
等于一级栏目的ID,假设需要提取ID为1的一级栏目下的所有二级栏目,可使用以下代码:
$dsql = new DedeSql(false); $sql = "SELECT id,typename,typedir FROM `dede_arctype` WHERE reid=1 And ishidden<>1 order by sortrank asc"; $dsql->SetQuery($sql); $dsql->Execute(); while ($row = $dsql->GetArray()) { echo $row['typename']; // 输出栏目名称 }
此方法适用于需要灵活处理数据的场景,但需注意SQL注入防护,建议使用织梦自带的dsql
类进行查询。
使用织梦标签提取二级栏目
在模板文件中,推荐使用织梦内置的channel
或type
标签调用二级栏目,以调用一级栏目ID为1的二级栏目为例,可通过以下标签实现:
{dede:channel type='son' typeid='1'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}
参数说明:

type='son'
:表示调用子栏目(即二级栏目);typeid='1'
:指定一级栏目的ID;[field:typelink/]
:栏目链接地址;[field:typename/]
:栏目名称。
若需调用多个一级栏目下的二级栏目,可结合arclist
标签或循环遍历实现,调用所有一级栏目及其对应的二级栏目:
{dede:channel type='top' typeid='0'} <dl> <dt>[field:typename/]</dt> <dd> {dede:channel type='son' reid='[field:id]'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel} </dd> </dl> {/dede:channel}
通过后台功能批量获取
若需要导出二级栏目列表,可利用织梦后台的“SQL命令工具”执行查询,路径为:后台首页 → 系统 → SQL命令工具 → 运行SQL命令,输入以下语句:
SELECT id,typename,typedir FROM `dede_arctype` WHERE reid<>0 And ishidden<>1 ORDER BY reid,sortrank;
执行后可查看所有二级栏目,并可导出为Excel或文本格式,方便数据整理。
注意事项
- 栏目状态检查:若栏目被隐藏(
ishidden=1
),则需在SQL或标签中添加ishidden<>1
条件,确保只显示有效栏目。 - 缓存问题:织梦栏目数据默认缓存,修改栏目后需在后台“更新系统缓存”或生成栏目HTML才能看到效果。
- 权限控制:部分站点对栏目设置了浏览权限,需在模板中添加
channel
标签的noselflink='yes'
或相关权限判断。
二级栏目提取常见场景应用
场景 | 实现方法 |
---|---|
导航栏下拉菜单 | 使用{dede:channel type='son'} 嵌套在一级栏目标签中,配合CSS实现样式。 |
首页栏目分类展示 | 通过{dede:arclist} 指定typeid 调用二级栏目下的文章列表。 |
相关问答FAQs
问题1:为什么使用{dede:channel type='son'}
调用不出二级栏目?
解答:可能原因包括:① 一级栏目ID错误,需确认typeid
值是否正确;② 二级栏目被隐藏(ishidden=1
),需在标签中添加ishidden='0'
;③ 模板缓存未更新,需在后台“更新HTML”并清理缓存。
问题2:如何提取二级栏目的文章数量?
解答:可通过SQL查询关联dede_archives
表,统计每个二级栏目下的文章数。
SELECT t.id,t.typename,COUNT(a.id) as articleCount FROM dede_arctype t LEFT JOIN dede_archives a ON t.id=a.arctypeid WHERE t.reid=1 GROUP BY t.id;
在模板中可使用{dede:sql sql="SELECT..."}[field:articleCount/]{/dede:sql}
调用结果。