织梦如何调用栏目子栏目列表

channel 子栏目 导航菜单

典型应用场景

企业站常见的「关于我们」下挂「公司简介、企业文化、联系方式」三个子栏目;产品中心下挂若干产品分类。在父栏目页或首页,往往需要把这些子栏目列出来,方便用户和搜索引擎快速跳转。

使用 channel 标签调用子栏目

核心是 {dede:channel} 标签,typeid 指定父栏目 ID,type='son' 表示只取直接子栏目:

{dede:channel type='son' typeid='1' row='10'}
  <li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}

type 参数取值

当前栏目的子栏目(自动获取typeid)

在列表页/封面页,可以用 typeid='@me' 或不写 typeid,让织梦自动取当前栏目:

{dede:channel type='son' currentstyle="
  <li class='active'><a href='~typelink~'>~typename~</a></li>"}
  <li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}

currentstyle 用于高亮当前选中栏目,~typelink~~typename~ 是占位符。

效果演示

调用子栏目并附文章数

想在每个子栏目后显示文章数量,可用 {dede:sql} 直接查库:

{dede:sql sql="SELECT typename,typedir,
  (SELECT COUNT(*) FROM dede_archives WHERE typeid=t.id) AS cnt
  FROM dede_arctype t WHERE reid=1 ORDER BY sortrank"}
  <li>
    <a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">
      [field:typename/] ([field:cnt/])
    </a>
  </li>
{/dede:sql}

三级菜单:channelartlist

需要输出多级菜单时,{dede:channelartlist} 是更强大的方案,可以嵌套子标签:

<ul class="nav">
{dede:channelartlist typeid='top' row='10'}
  <li>
    <a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
    <ul class="sub">
    {dede:channel type='son' noself='yes'}
      <li><a href="[field:typelink/]">[field:typename/]</a></li>
    {/dede:channel}
    </ul>
  </li>
{/dede:channelartlist}
</ul>
注意:noself='yes' 表示不输出当前栏目本身,否则在子栏目页会出现重复。

获取子栏目缩略图

栏目编辑里可以上传「栏目图片」litpic 字段,模板中用:

{dede:channel type='son' typeid='1'}
  <a href="[field:typelink/]">
    <img src="[field:litpic/]" alt="[field:typename/]">
    <span>[field:typename/]</span>
  </a>
{/dede:channel}

常见坑:栏目 typedir 出现 {cmspath}

直接输出 [field:typedir/] 会带上 {cmspath},应改用 [field:typelink/],它会自动拼接完整 URL。

落地建议

把多级菜单封进一个 nav.htm 公共文件,首页、列表页、内容页统一引入。上线后建议在百度站长平台抓取诊断一次,确认所有子栏目链接都能被正常抓取。栏目层级不要太深,理想是「首页 → 一级 → 二级」三层结构,超过三层不仅用户难找,权重传递也会被稀释。定期清理空栏目,保证每条子栏目都有内容支撑,菜单才不会变成「空架子」。