dede如何获取当前栏目的所有子栏目?

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 DEDE建站 正文

使用 channelartlist 标签(推荐,最灵活)

这是最推荐的方法,因为它功能强大,可以轻松获取子栏目的各种信息,并且支持自定义样式。

dede获取当前栏目的子栏目
(图片来源网络,侵删)

适用场景:在当前栏目页(如 list_article_articleid_1.html)或栏目封面页(如 category_1.html)中,显示其直接子栏目的列表。

核心代码

{dede:channelartlist typeid='top' currentstyle='active'}
    {dede:type}
        <h2><a href='[field:typeurl/]'>[field:typename/]</a></h2>
    {/dede:type}
    {dede:channel type='son' noself='yes'}
        <li><a href='[field:typeurl/]'>[field:typename/]</a></li>
    {/dede:channel}
{/dede:channelartlist}

代码详解

  1. {dede:channelartlist ...}

    • typeid='top': 这个参数是关键,它告诉系统从顶级栏目开始循环,即使你当前在二级栏目下,它也会从网站的顶级栏目开始查找。{dede:channelartlist} 会循环每一个顶级栏目。
    • currentstyle='active': 这个参数用于高亮显示当前所在的顶级栏目,你可以在 {dede:type} 标签内使用它,
      {dede:type currentstyle="<h2 class='current'><a href='[field:typeurl/]'>[field:typename/]</a></h2>"}
          <h2><a href='[field:typeurl/]'>[field:typename/]</a></h2>
      {/dede:type}

      这样,当前顶级栏目的 <h2> 会自动加上 class="current"

  2. {dede:type}

    dede获取当前栏目的子栏目
    (图片来源网络,侵删)
    • 这个标签用于获取 channelartlist 循环到的当前顶级栏目的信息。[field:typename/] 就是这个顶级栏目的名称,[field:typeurl/] 是它的链接。
  3. {dede:channel type='son' noself='yes'}

    • 这个标签嵌套在 {dede:type} 内部,它的作用是获取当前顶级栏目的直接子栏目
    • type='son': 指定获取子栏目。
    • noself='yes': 表示不包含栏目本身,这是一个好习惯,可以避免不必要的麻烦。
    • [field:typename/][field:typeurl/]: 在这个循环里,它们分别代表每个子栏目的名称和链接。

如何只获取当前栏目的子栏目?

如果你只想显示当前所在栏目的子栏目,而不是所有顶级栏目的子栏目,代码可以简化为:

{dede:channel type='son' typeid=''}
    <li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
  • typeid='': 当留空时,typeid 会自动获取当前页面的栏目ID,type='son' 就会查找这个ID栏目的所有子栏目,这是最简洁直接的写法。

使用 arclist 标签(简单,仅限名称和链接)

如果你只需要一个简单的子栏目列表,并且不关心栏目简介、图片等信息,arclist 也是一个非常简单快捷的选择。

适用场景:快速获取子栏目的名称和链接。

dede获取当前栏目的子栏目
(图片来源网络,侵删)

核心代码

{dede:arclist row='10' typeid='son'}
    <a href='[field:arcurl/]'>[field:title/]</a>
{/dede:arclist}

代码详解

  • typeid='son': 和 channel 标签一样,son 表示获取当前栏目的子栏目。
  • row='10': 限制输出的子栏目数量,例如只显示10个子栏目。
  • [field:arcurl/][field:title/]: 在 arclist 中,arcurl 代表栏目链接,title 代表栏目名称。

使用 SQL 查询(最灵活,适合复杂逻辑)

如果你需要根据子栏目的某些特定字段(如排序、文章数等)进行排序,或者需要进行更复杂的判断,那么直接执行 SQL 查询是最佳选择。

适用场景:需要自定义排序、获取额外栏目字段(如 keywords)、或在 PHP 代码中处理子栏目数据。

核心代码

{dede:sql sql='SELECT * FROM `dede_arctype` WHERE reid=~id~ ORDER BY sortrank'}
    <li><a href='[field:typedir function="MakeDir(@me)"/]'>[field:typename/]</a></li>
{/dede:sql}

代码详解

  • dede:sql: 自定义SQL查询标签。
  • SELECT * FROM dede_arctype: dede_arctype 是 DedeCMS 中存储栏目的数据表。
  • WHERE reid=~id~: 这是查询的核心。
    • reid 字段代表“父栏目ID”。
    • ~id~ 是 DedeCMS 的一个特殊变量,会自动被替换为当前栏目的ID。
    • 所以这句代码的意思是:查找所有父栏目ID等于当前栏目ID的记录,也就是所有子栏目。
  • ORDER BY sortrank: 按照后台设置的“排序值”进行升序排列,你也可以改成 ORDER BY id DESC 按ID降序排列。
  • [field:typedir function="MakeDir(@me)"/]: 获取栏目的目录路径,并用 MakeDir 函数处理,确保链接格式正确。
  • [field:typename/]: 获取栏目名称。

总结与对比

方法 优点 缺点 推荐场景
channelartlist 最灵活,功能强大,支持嵌套循环,可获取任意层级的栏目。 代码结构相对复杂一点。 通用场景,特别是需要制作多级导航栏时。
channel 最简洁,专为栏目设计,代码易读。 功能相对单一,不如 channelartlist 灵活。 简单需求,只需要在当前栏目页显示其子栏目列表。
arclist 代码非常简单。 仅能获取名称和链接,功能有限。 超简单的子栏目列表展示。
sql 最灵活,完全控制查询逻辑,可做任何复杂排序和筛选。 需要懂 SQL 语法,有出错风险。 有特殊排序需求,或需要获取栏目特定字段时。

对于绝大多数情况,方法一(channelartlist方法一简化版(channel 是你的首选,它们既安全又高效。

-- 展开阅读全文 --
头像
织梦模板手机站怎么添加?
« 上一篇 01-22
织梦网站分享图标不显示怎么办?
下一篇 » 01-22

相关文章

取消
微信二维码
支付宝二维码

目录[+]