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

(图片来源网络,侵删)
场景分析
假设我们要调用 ID 为 5 的顶级栏目下的所有直接子栏目及其描述。
使用 channelartlist 标签(推荐,最常用)
这是最直接、最推荐的方法。channelartlist 标签专门用于调用顶级栏目及其子栏目,语法清晰。
适用场景:当你想在一个父栏目页(如栏目列表页 list_article5.htm)或首页,展示某个父栏目下的所有子栏目时。
代码示例:

(图片来源网络,侵删)
{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}
代码详解:
-
{dede:channelartlist typeid='5'}typeid='5':这是核心参数,指定了你要调用的父栏目的 ID,这里就是 ID 为 5 的栏目。- 这个标签会循环一次,处理 ID 为 5 的这个父栏目本身。
-
{dede:field name='typename'/}- 在
channelartlist内部,这个标签用于显示当前循环的父栏目的名称,它会显示“ID为5的栏目”的名称。
- 在
-
{dede:channel type='son' noself='yes'}- 这个标签嵌套在
channelartlist内部,用于调用其父栏目的子栏目。 type='son':表示只调用当前顶级栏目(ID=5)的直接子栏目,不包含孙栏目。noself='yes':表示不调用栏目本身,只调用子栏目,加上这个更规范。
- 这个标签嵌套在
-
[field:typelink/]子栏目的链接地址。
-
[field:typename/]子栏目的名称。
-
[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,在channelartlist和channel的嵌套结构中,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}
代码详解:
{dede:sql sql='...'}:执行自定义的 SQL 语句。SELECT id, typename, description, typedir FROM#@__arctype``:- 从
#@__arctype表(DedeCMS 存放栏目的表)中查询id(栏目ID)、typename(栏目名)、description(栏目描述)、typedir(栏目目录)这几个字段。
- 从
WHERE reid = 5:reid字段是“上级栏目ID”。reid = 5的意思就是“查找所有上级栏目ID为5的栏目”,这正是我们要找的子栏目。
AND ishidden = 0:排除在后台设置为“隐藏”的栏目。
ORDER BY sortrank ASC:按照后台设置的“排序值”从小到大进行排序,这是最常用的排序方式。
[field:typedir function='str_replace("{cmspath}", "", "@me")'/]:typedir字段的值通常是{cmspath}/a/b这样的格式,我们通常只需要/a/b部分,所以用function对其进行处理,去掉{cmspath}部分,得到正确的相对链接。
总结与建议
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
channelartlist |
代码最简洁、最符合DedeCMS设计理念、性能较好 | 灵活性相对SQL较低 | 绝大多数情况下,这是首选和最佳方案 |
arclist 嵌套 |
功能强大,可轻松结合文章列表 | 代码结构稍复杂 | 需要在展示子栏目的同时,附带展示该栏目下的文章 |
sql 查询 |
灵活性最高,可处理任何复杂逻辑 | 代码可读性差,有一定SQL注入风险(需注意),性能可能略低 | 内置标签无法满足的、高度定制化的需求 |
对于你的问题“调用id下的所有栏目和描述”,强烈推荐使用方法一 (channelartlist),因为它最简单、最直接,也最不容易出错。
