dede如何调用指定ID下所有栏目及描述?

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

这里为您提供几种最常用和最实用的方法,从简单到复杂,并附上详细的代码解释。

dede调用id下的所有栏目和描述
(图片来源网络,侵删)

场景分析

假设我们要调用 ID 为 5 的顶级栏目下的所有直接子栏目及其描述。


使用 channelartlist 标签(推荐,最常用)

这是最直接、最推荐的方法。channelartlist 标签专门用于调用顶级栏目及其子栏目,语法清晰。

适用场景:当你想在一个父栏目页(如栏目列表页 list_article5.htm)或首页,展示某个父栏目下的所有子栏目时。

代码示例:

dede调用id下的所有栏目和描述
(图片来源网络,侵删)
{dede:channelartlist typeid='5'}
    <h2>{dede:field name='typename'/}</h2> <!-- 父栏目名称 -->
    <ul>
        {dede:channel type='son' noself='yes'}
        <li>
            <a href="[field:typelink/]">[field:typename/]</a>
            <p class="description">[field:description/]</p>
        </li>
        {/dede:channel}
    </ul>
{/dede:channelartlist}

代码详解:

  1. {dede:channelartlist typeid='5'}

    • typeid='5':这是核心参数,指定了你要调用的父栏目的 ID,这里就是 ID 为 5 的栏目。
    • 这个标签会循环一次,处理 ID 为 5 的这个父栏目本身。
  2. {dede:field name='typename'/}

    • channelartlist 内部,这个标签用于显示当前循环的父栏目的名称,它会显示“ID为5的栏目”的名称。
  3. {dede:channel type='son' noself='yes'}

    • 这个标签嵌套在 channelartlist 内部,用于调用其父栏目的子栏目。
    • type='son':表示只调用当前顶级栏目(ID=5)的直接子栏目,不包含孙栏目。
    • noself='yes':表示不调用栏目本身,只调用子栏目,加上这个更规范。
  4. [field:typelink/]

    子栏目的链接地址。

  5. [field:typename/]

    子栏目的名称。

  6. [field:description/]

    • 这是你需要的,子栏目的描述,它会输出你在后台“栏目管理”中为该子栏目填写的“栏目描述”内容。

使用 arclist 标签(适用于需要调用子栏目文章的场景)

你可能不仅想列出子栏目,还想在每个子栏目下调用几篇最新的文章。arclist 标签可以结合子栏目ID来实现。

适用场景:在父栏目页,展示子栏目列表,并且每个子栏目下附带几篇推荐或最新文章。

代码示例:

{dede:channelartlist typeid='5'}
    <h2>{dede:field name='typename'/}</h2>
    {dede:channel type='son' noself='yes'}
        <div class="sub-column">
            <h3><a href="[field:typelink/]">[field:typename/]</a></h3>
            <p class="description">[field:description/]</p>
            <!-- 调用当前子栏目的最新5篇文章 -->
            <ul class="article-list">
                {dede:arclist row='5' titlelen='30' channelid='1'}
                <li><a href="[field:arcurl/]">[field:title/]</a></li>
                {/dede:arclist}
            </ul>
        </div>
    {/dede:channel}
{/dede:channelartlist}

代码详解:

  • 这段代码的结构和方法一类似,但在 {dede:channel} 循环内部,我们嵌套了一个 {dede:arclist}
  • {dede:arclist row='5' titlelen='30' channelid='1'}
    • row='5':调用5篇文章。
    • titlelen='30'长度限制为30个字符。
    • channelid='1':这是关键。arclist 默认是在当前栏目下查找文章,因为我们是在 channel 标签循环内,它默认会去找当前循环的子栏目下的文章,但有时为了确保准确,可以显式指定 channelid,在 channelartlistchannel 的嵌套结构中,arclist 会自动识别当前子栏目,所以通常可以省略 channelid

使用 SQL 查询(最灵活,适合复杂需求)

如果你的需求非常特殊,比如需要自定义排序、或者需要调用一些额外的字段,直接写 SQL 查询是最灵活的。

适用场景:当内置标签无法满足你的复杂逻辑时,例如按特定字段排序、或调用非标准字段。

代码示例:

{dede:sql sql='
    SELECT 
        id, 
        typename, 
        description, 
        typedir 
    FROM 
        `#@__arctype` 
    WHERE 
        reid = 5 
    AND 
        ishidden = 0 
    ORDER BY 
        sortrank ASC
'}
    <li>
        <a href="[field:typedir function='str_replace("{cmspath}", "", "@me")'/]">[field:typename/]</a>
        <p class="description">[field:description/]</p>
    </li>
{/dede:sql}

代码详解:

  1. {dede:sql sql='...'}:执行自定义的 SQL 语句。
  2. SELECT id, typename, description, typedir FROM#@__arctype``:
    • #@__arctype 表(DedeCMS 存放栏目的表)中查询 id(栏目ID)、typename(栏目名)、description(栏目描述)、typedir(栏目目录)这几个字段。
  3. WHERE reid = 5
    • reid 字段是“上级栏目ID”。reid = 5 的意思就是“查找所有上级栏目ID为5的栏目”,这正是我们要找的子栏目。
  4. AND ishidden = 0

    排除在后台设置为“隐藏”的栏目。

  5. ORDER BY sortrank ASC

    按照后台设置的“排序值”从小到大进行排序,这是最常用的排序方式。

  6. [field:typedir function='str_replace("{cmspath}", "", "@me")'/]
    • typedir 字段的值通常是 {cmspath}/a/b 这样的格式,我们通常只需要 /a/b 部分,所以用 function 对其进行处理,去掉 {cmspath} 部分,得到正确的相对链接。

总结与建议

方法 优点 缺点 推荐场景
channelartlist 代码最简洁、最符合DedeCMS设计理念、性能较好 灵活性相对SQL较低 绝大多数情况下,这是首选和最佳方案
arclist 嵌套 功能强大,可轻松结合文章列表 代码结构稍复杂 需要在展示子栏目的同时,附带展示该栏目下的文章
sql 查询 灵活性最高,可处理任何复杂逻辑 代码可读性差,有一定SQL注入风险(需注意),性能可能略低 内置标签无法满足的、高度定制化的需求

对于你的问题“调用id下的所有栏目和描述”,强烈推荐使用方法一 (channelartlist),因为它最简单、最直接,也最不容易出错。

-- 展开阅读全文 --
头像
织梦企业信息管理系统v1.1有何核心优势?
« 上一篇 2025-12-14
dede自定义表单如何用js实现省市区联动?
下一篇 » 2025-12-14

相关文章

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