织梦导航菜单自动生成标签

导航菜单是织梦模板中最先被访问者看到的部分,也是搜索引擎抓取站点结构的入口。手工写死菜单链接虽然简单,但每次新增栏目都要改模板,维护成本极高。使用织梦内置的导航菜单自动生成标签,可以让菜单跟随栏目结构实时变化,本文围绕 channel 标签与多级菜单生成展开。

一、channel 标签基础写法

channel 是织梦用来调取栏目标签的核心标签,常用于顶部导航、底部栏目地图、侧栏分类。最简单的顶部导航写法:

<ul class="nav">
  <li><a href="/">首页</a></li>
  {dede:channel type='top' row='10' currentstyle="<li class='on'><a href='~typelink~'>~typename~</a></li>"}
    <li><a href="[field:typelink/]">[field:typename/]</a></li>
  {/dede:channel}
</ul>

关键参数说明:

  • type='top':只调用顶级栏目;type='son' 调用子栏目;type='self' 调用同级栏目
  • row='10':调用数量
  • currentstyle:当前栏目高亮样式,~typelink~~typename~ 为占位符

二、多级下拉菜单生成

织梦 channel 标签默认只输出一级,要做二级下拉需用 channelartlist 标签嵌套。channelartlist 会同时输出栏目信息和子栏目列表:

{dede:channelartlist typeid='top' row='10'}
  <li class="has-sub">
    <a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
    {dede:field name='typeid' runphp='yes'}
      global $dsql;
      $sql="SELECT * FROM dede_arctype WHERE reid=@me AND ishidden=0 ORDER BY sortrank";
      @me=$dsql->GetOne($sql) ? "<ul class='sub'>" : '';
    {/dede:field}
    {dede:channel type='son' noself='yes'}
      <li><a href="[field:typelink/]">[field:typename/]</a></li>
    {/dede:channel}
    {dede:field name='typeid' runphp='yes'}@me=@me ? '</ul>' : '';{/dede:field}
  </li>
{/dede:channelartlist}

这种写法能根据是否有子栏目动态输出 <ul> 标签,避免出现空的下拉。

三、菜单排序与隐藏控制

channel 默认按 sortrank 升序排列,可在"后台 - 网站栏目管理"中调整栏目排序值控制菜单顺序。若某些栏目不想出现在导航,可设置栏目为"隐藏":ishidden=1,channel 标签会自动过滤。

如需让导航包含单页(关于我们、联系方式等),可改用 channelartlist 并配合 type='single' 或在 SQL 中 union 单页表。

四、注意事项

channel 标签的 typeid 不填默认从当前页上下文取,首页调用需显式指定 typeid='top'
多级菜单在前台依赖 CSS 与 JS 控制显示,记得给 .has-sub 绑定 hover 或 click 事件。
栏目链接 [field:typelink/] 已包含相对路径,移动模板时无需改写。
导航数量过多会撑破布局,建议控制在 8 个以内,超出部分归入"更多"下拉。

五、后续优化方向

掌握织梦导航菜单自动生成标签后,建议结合用户访问热力图调整栏目排序,把高频访问的栏目前置。同时为菜单链接加上 title 属性、为当前栏目增加结构化数据标记,让导航既服务于用户体验也服务于搜索引擎理解站点结构。对于营销型站点,可在导航中嵌入转化入口(在线咨询、预约按钮),把每一次菜单点击都引导到业务目标,让导航从单纯的"找路工具"升级为流量调度枢纽。