在织梦(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}调用结果。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/315983.html<
