dede如何调用三级栏目及对应文章标题?

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

下面我将为你提供最常用、最标准的实现方法,并附上详细的代码解释和注意事项。

dede调用三级栏目及栏目下的文章标题
(图片来源网络,侵删)

核心思路

这个功能的实现逻辑是“循环套循环”:

  1. 第一层循环:调用并循环你指定的二级栏目
  2. 第二层循环:在每一个二级栏目下,调用并循环它的所有三级子栏目
  3. 第三层循环:在每一个三级栏目下,调用并循环它的文章列表(只获取文章标题)。

标准嵌套循环法(推荐)

这是最清晰、最容易理解的方法,适合大多数场景。

场景假设

假设你的网站结构如下:

  • 一级栏目:网站首页
  • 二级栏目:产品中心 (ID假设为 2)
    • 三级栏目:智能手机 (ID假设为 5)

      文章:iPhone 15 发布、华为 Mate 60 Pro 评测

      dede调用三级栏目及栏目下的文章标题
      (图片来源网络,侵删)
    • 三级栏目:笔记本电脑 (ID假设为 6)

      文章:ThinkPad 新品、MacBook Pro 性能测试

  • 二级栏目:新闻资讯 (ID假设为 3)
    • 三级栏目:公司动态 (ID假设为 7)

      文章:公司乔迁、年会圆满结束

    • 三级栏目:行业新闻 (ID假设为 8)

      文章:2025年科技趋势报告

我们的目标是在页面上展示“产品中心”下的所有三级栏目及其文章。

dede调用三级栏目及栏目下的文章标题
(图片来源网络,侵删)

完整代码示例

将以下代码放置到你需要显示这个列表的模板文件中(通常是 index.htm 或其他自定义的栏目模板)。

{dede:channel type='son' typeid='2'}
    <dl>
        <dt><a href="[field:typelink/]">[field:typename/]</a></dt>
        <dd>
            <!-- 第二层循环:循环当前二级栏目下的所有三级栏目 -->
            {dede:channel type='son' currentstyle=''}
                <div class="third-category">
                    <h3><a href="[field:typelink/]">[field:typename/]</a></h3>
                    <ul>
                        <!-- 第三层循环:循环当前三级栏目下的文章列表 -->
                        {dede:arclist titlelen='42' row='5'}
                        <li>
                            <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
                            <span class="art_date">[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
                        </li>
                        {/dede:arclist}
                    </ul>
                </div>
            {/dede:channel}
        </dd>
    </dl>
{/dede:channel}

代码逐行详解

  1. {dede:channel type='son' typeid='2'}

    • 作用:这是第一层循环,用于获取指定的二级栏目及其所有三级子栏目。
    • typeid='2':这是最关键的参数,你需要将其替换为你自己的二级栏目ID,如果你想获取多个二级栏目(比如ID为2和3),可以用逗号隔开:typeid='2,3'
    • type='son':表示获取 typeid 指定栏目的所有直接子栏目(即三级栏目)。
    • [field:typelink/][field:typename/]:这是二级栏目的链接和名称,但我们在这个循环里通常不会直接使用它们,因为我们的重点是它们下面的子栏目。
  2. {dede:channel type='son' currentstyle=''}

    • 作用:这是第二层循环,嵌套在第一层循环内部,它会循环遍历由第一层获取到的每一个三级栏目。
    • type='son':再次使用 son 类型,因为第一层循环已经定位到了二级栏目,这里的 son 就是指向三级栏目。
    • currentstyle='':我们留空,因为通常不需要对当前栏目进行特殊样式处理。
    • [field:typelink/][field:typename/]:这里是三级栏目的链接和名称,我们用它来作为文章列表的标题。
  3. {dede:arclist titlelen='42' row='5'}

    • 作用:这是第三层循环,用于获取并循环当前三级栏目下的文章列表。
    • typeid注意,这个标签在嵌套循环中会自动继承外层 {dede:channel} 循环中的栏目ID,你不需要手动指定 typeid,它会自动获取当前正在循环的三级栏目的ID,并调用该栏目下的文章,这是织梦标签非常智能的一点。
    • titlelen='42':截取文章标题的长度,防止标题过长影响布局,42个半角字符(约21个汉字)。
    • row='5':获取文章的数量,这里设置为5篇,你可以根据需要修改。
    • [field:arcurl/]:文章链接。
    • [field:title/]
    • [field:pubdate function="MyDate('Y-m-d', @me)"/]:文章发布日期,通过函数格式化为 年-月-日 的形式。

使用SQL查询法(更灵活)

如果你的需求非常复杂,或者需要更精确地控制数据,可以直接使用SQL查询。

{dede:sql sql="SELECT id,typename,typedir FROM `dede_arctype` WHERE reid=2 AND ishidden<>1 ORDER BY sortrank ASC"}
    <dl>
        <dt><a href="[field:typedir function='str_replace("{cmspath}","",$url)'/]">[field:typename/]</a></dt>
        <dd>
            <!-- 循环三级栏目下的文章 -->
            {dede:arclist typeid='[field:id/]' titlelen='42' row='5'}
                <li>
                    <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
                </li>
            {/dede:arclist}
        </dd>
    </dl>
{/dede:sql}

代码详解

  1. {dede:sql ...}
    • sql="...":直接执行SQL语句。
    • SELECT id,typename,typedir FROM dede_arctype:从栏目表 dede_arctype 中查询字段。
    • WHERE reid=2:这是核心条件。reid 字段表示“父栏目ID”。reid=2 就是查询父栏目ID为2的所有栏目,也就是所有三级栏目。
    • AND ishidden<>1:排除隐藏的栏目。
    • ORDER BY sortrank ASC:按照后台设置的排序进行升序排列。
  2. [field:id/]:在SQL查询中获取到的 id 字段,也就是三级栏目的ID。
  3. [field:typedir function='str_replace("{cmspath}","",$url)'/]typedir 字段中包含了 {cmspath} 这样的占位符,需要用 function 将其替换为真实的网站路径,才能得到正确的链接。

总结与建议

特性 标准嵌套循环 SQL查询
易用性 ,标签化思维,直观易懂 ,需要懂SQL语法
可读性 ,模板结构清晰 ,SQL语句嵌入模板中
灵活性 一般,受限于织梦标签的功能 极高,可以写任意复杂的SQL
适用场景 90%的常规需求,强烈推荐 需要复杂筛选、排序或计算等高级场景

对于绝大多数用户来说,强烈推荐使用方法一,它不仅代码清晰,而且不容易出错,符合DedeCMS的设计哲学。

最后的小提示:在编写模板时,请务必确认你的栏目ID是否正确,这是导致调用失败最常见的原因,你可以在DedeCMS后台的【频道管理】中,鼠标悬停在栏目名称上,浏览器左下角会显示链接,其中的数字就是栏目ID。

-- 展开阅读全文 --
头像
C语言为何包含C++的iostream头文件?
« 上一篇 2025-12-02
织梦首页去掉index.html 方法
下一篇 » 2025-12-02

相关文章

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

目录[+]