准备工作:获取当前栏目的父栏目ID
在 DedeCMS 的模板文件中,有一个非常重要的全局变量 $type,它包含了当前栏目的所有信息,我们可以从中轻松获取父栏目的ID。

<?php $parentid = $type->topid; // 获取当前栏目的顶级栏目ID $parentid = $type->reid; // 获取当前栏目的直接父栏目ID ?>
$type->reid: 获取当前栏目的直接父栏目的ID,如果你在“新闻”栏目下,想调用“公司简介”栏目的文章(假设它们是同级),并且它们的父栏目是“关于我们”,那么你应该用reid。$type->topid: 获取当前栏目的顶级栏目的ID,无论当前栏目在哪一层级,它都能找到最顶层的那个栏目ID。
在大多数情况下,我们使用 $type->reid 就足够了。
调用父栏目的最新文章(最常用)
这是最常见的需求,即在当前页面调用其父栏目下的最新 N 篇文章。
场景示例
假设网站结构如下:
- 关于我们 (顶级栏目, ID=2)
- 公司简介 (子栏目, ID=3)
- 企业文化 (子栏目, ID=4)
- 发展历程 (子栏目, ID=5)
当用户访问“公司简介”(ID=3) 这个页面时,我们希望在页面上显示“关于我们”(ID=2) 这个顶级栏目下的最新文章。

模板代码
将以下代码放置在你需要显示父栏目文章的模板文件中(article_article.htm 或 list_category.htm)。
<h3>关于我们栏目最新文章</h3>
<ul>
{dede:sql sql="SELECT id, title, pubdate FROM `dede_archives` WHERE typeid=~reid ORDER BY pubdate DESC LIMIT 0, 10"}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>([field:pubdate function='MyDate('Y-m-d', @me)'/])</span>
</li>
{/dede:sql}
</ul>
代码解析
-
typeid=~reid:typeid: 这是arclist或sql标签中用于指定栏目ID的参数。~reid: 这是 DedeCMS 的一个特殊用法。 符号在这里表示“取反”或“非”,但在typeid参数的上下文中,它被巧妙地用来直接引用一个 PHP 变量。~reid的意思就是“使用$type->reid这个变量的值作为typeid”。typeid=~reid就等同于typeid=2(在“公司简介”页面)。
-
FROMdede_archives``:dede_archives是 DedeCMS 存储文章核心数据的表,我们直接查询这个表来获取文章列表。
-
SELECT id, title, pubdate:
(图片来源网络,侵删)我们只需要文章的ID(用于生成链接)、标题和发布时间,所以只查询这三个字段,效率更高。
-
ORDER BY pubdate DESC:按照发布时间降序排列,确保最新的文章排在最前面。
-
LIMIT 0, 10:限制只调用10篇文章,你可以根据需要修改这个数字。
-
[field:arcurl/]:- 使用
sql标签时,[field:arcurl/]可以自动生成文章的完整链接,非常方便。
- 使用
使用 arclist 标签调用(更符合DedeCMS习惯)
如果你更喜欢使用 DedeCMS 原生的 arclist 标签,同样可以实现。
模板代码
<h3>关于我们栏目最新文章 (arclist)</h3>
<ul>
{dede:arclist typeid=~reid titlelen='40' row='10' orderby='pubdate'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>([field:pubdate function='MyDate('Y-m-d', @me)'/])</span>
</li>
{/dede:arclist}
</ul>
代码解析
typeid=~reid: 和sql标签一样,这是核心,用来指定父栏目的ID。titlelen='40': 标题长度限制,防止标题过长影响布局。row='10': 调用文章的数量。orderby='pubdate': 按发布时间排序。
arclist 标签使用起来更简单,功能也更丰富,是 DedeCMS 首选的列表调用标签。
调用父栏目的子栏目中的文章
有时候需求更复杂一点:不是调用父栏目自己的文章(如果父栏目允许发布文章的话),而是调用父栏目下所有子栏目的文章。
场景示例
继续上面的例子,在“公司简介”(ID=3) 页面,我们想显示“关于我们”(ID=2) 下的“公司简介”、“企业文化”、“发展历程”所有子栏目的最新文章。
模板代码
<h3>关于我们旗下所有子栏目的最新文章</h3>
<ul>
{dede:sql sql="SELECT id, title, pubdate FROM `dede_archives` WHERE typeid IN (SELECT id FROM `dede_arctype` WHERE reid=~reid) ORDER BY pubdate DESC LIMIT 0, 15"}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>([field:pubdate function='MyDate('Y-m-d', @me)'/])</span>
</li>
{/dede:sql}
</ul>
代码解析
关键在于这句 WHERE typeid IN (SELECT id FROM dede_arctype WHERE reid=~reid):
- 内层查询
(SELECT id FROM dede_arctype WHERE reid=~reid):- 这个子查询会去
dede_arctype(栏目表) 中查找所有reid(父栏目ID) 等于当前栏目父ID (~reid) 的栏目。 - 在我们的例子中,它会返回
3, 4, 5这三个ID。
- 这个子查询会去
- 外层查询
WHERE typeid IN (...):- 主查询会筛选出
typeid(文章所属栏目ID) 在3, 4, 5这个集合中的所有文章。 - 这样就实现了调用父栏目下所有子栏目文章的目的。
- 主查询会筛选出
总结与建议
| 需求场景 | 推荐方法 | 核心代码/标签 |
|---|---|---|
| 调用父栏目的最新文章 | 方法一 (SQL) 或 方法二 (arclist) | typeid=~reid |
| 调用父栏目所有子栏目的文章 | 方法三 (嵌套SQL) | typeid IN (SELECT id FROM dede_arctype WHERE reid=~reid) |
最佳实践建议:
- 优先使用
arclist:对于简单的父栏目文章调用,{dede:arclist typeid=~reid ...}是最简单、最标准、也最不容易出错的方式。 - 复杂需求用
sql:当需要调用子栏目文章或进行更复杂的数据筛选时,{dede:sql ...}提供了更大的灵活性。 - 注意缓存:DedeCMS 有强大的缓存机制,当你修改了模板代码后,如果页面没有立即更新,请到后台“生成” -> “更新HTML” -> “更新栏目”,或者清除一下缓存。
- 检查权限:确保你调用的父栏目是“允许发布文章”的,否则
arclist标签可能不会返回任何结果,你可以在后台“栏目” -> “高级选项”中设置。
希望这些详细的解释和代码能帮助你完美解决在 DedeCMS 中调用父栏目文章的问题!
