场景分析
通常我们说的“调用指定栏目内容”有以下几种情况:

(图片来源网络,侵删)
- 调用一个栏目的最新文章列表:最常见的需求,比如在首页调用“公司新闻”栏目的最新5篇文章。
- 调用多个指定栏目的文章列表:比如在首页同时调用“产品中心”和“行业资讯”两个栏目的文章。
- 调用指定栏目的子栏目列表:调用某个栏目下的所有一级子栏目。
- 调用指定栏目的文章,并排除某些子栏目:比如调用“新闻中心”下的所有文章,但不包括“广告公告”这个子栏目。
下面我将针对这些场景,提供最常用的代码和详细解释。
使用 arclist 标签(最常用、最灵活)
arclist 是DedeCMS最强大的列表标签,可以满足绝大多数调用文章的需求。
调用一个指定栏目的最新文章
这是最基础的需求,假设你要调用栏目ID为 1 的“公司新闻”栏目的最新5篇文章。
代码:

(图片来源网络,侵删)
{dede:arclist row='5' typeid='1'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:arclist}
代码详解:
{dede:arclist ...}: 调用文章列表的开始标签。row='5': 表示获取的文章数量为5条。typeid='1': 这是核心参数,指定要调用的栏目ID,你可以在后台“栏目管理”中找到对应栏目的ID。[field:arcurl/]: 调用文章的链接地址。[field:title/]:调用文章的标题。[field:pubdate ...]: 调用文章的发布日期。function="MyDate('Y-m-d', @me)"是一个格式化函数,将日期格式化为年-月-日的形式,你也可以改成m-d或其他格式。
</li>和{/dede:arclist}: 循环的结束标签。
调用多个指定栏目的文章
如果你需要同时调用栏目ID为 1 和 2 的文章,只需要用英文逗号 分隔即可。
代码:
{dede:arclist row='8' typeid='1,2'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
typeid='1,2': 指定调用栏目ID为1和栏目ID为2的所有文章,总共显示8条(row='8')。
调用指定栏目的文章,并排除某些子栏目
使用 typeid 和 innertext 结合可以实现更复杂的需求,假设你想调用栏目ID为 3 的“新闻中心”下的所有文章,但排除其子栏目ID为 5 的“广告公告”。

(图片来源网络,侵删)
代码:
{dede:arclist typeid='3' channelid='1'}
{dede:field name='typeid' runphp='yes'}
if(@me == 5) {
@me = "";
} else {
@me = "<li><a href='[field:arcurl/]'>[field:title/]</a></li>";
}
{/dede:field}
{/dede:arclist}
代码详解:
typeid='3': 先指定主栏目ID为3。channelid='1': 指定内容模型ID(通常是文章模型,ID为1)。{dede:field name='typeid' runphp='yes'}: 在循环中获取每篇文章所属的栏目ID,并启用PHP运行。if(@me == 5): 判断如果当前文章的栏目ID等于5(即“广告公告”),则@me赋值为空字符串,即不显示。else: 否则,生成标准的列表项HTML代码。- 这种方法比较灵活,但代码稍复杂,对于简单的排除,可以使用
notypeid参数。
使用 channelartlist 标签(调用栏目及其文章)
如果你想在调用栏目列表的同时,在每个栏目下面显示该栏目的最新文章,channelartlist 是最佳选择。
场景:首页布局,显示“公司新闻”、“产品中心”等几个主要栏目,每个栏目下都带几条最新文章。
代码:
{dede:channelartlist typeid='1,2' row='2'}
<div class="box">
<h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
<ul>
{dede:arclist row='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{dede:arclist}
</ul>
</div>
{/dede:channelartlist}
代码详解:
{dede:channelartlist ...}: 循环指定栏目的开始标签。typeid='1,2': 指定要循环的栏目ID(只显示这两个栏目)。row='2': 指定循环的栏目数量(只显示2个栏目)。{dede:field name='typeurl'/}: 获取当前栏目的链接地址。{dede:field name='typename'/}: 获取当前栏目的名称。{dede:arclist row='5'}: 在channelartlist内部,arclist会默认调用当前栏目的文章,所以这里不需要再写typeid。
使用 SQL 查询标签(最灵活,但需谨慎)
对于 arclist 无法满足的超复杂需求,可以直接使用 dede_sql 标签执行自定义的SQL语句。
场景:调用栏目ID为 1 的文章,并按自定义字段 click(点击量)排序。
代码:
{dede:sql sql='SELECT id, title, arcurl FROM dede_archives WHERE typeid=1 ORDER BY click DESC LIMIT 0, 5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:sql}
代码详解:
{dede:sql sql='...'}: 执行自定义SQL语句的开始标签。sql='...': 这里是完整的SQL查询语句。SELECT id, title, arcurl FROM dede_archives: 从文章表dede_archives中查询文章ID、标题和链接。WHERE typeid=1: 筛选条件,只查询栏目ID为1的文章。ORDER BY click DESC: 按点击量click字段降序排列。LIMIT 0, 5: 限制查询结果,从第0条开始,取5条(即前5条)。
[field:arcurl/]和[field:title/]: 在sql标签中,直接使用field:来获取查询结果中的字段。
⚠️ 警告:直接使用SQL有安全风险,请确保你的SQL语句是安全的,并且不要在生产环境中随意使用未经验证的SQL。
总结与最佳实践
| 适用场景 | 优点 | 缺点 | |
|---|---|---|---|
arclist |
绝大多数情况:调用单个/多个栏目的文章列表,可控制数量、排序、标题截取等。 | 功能强大,参数丰富,官方推荐,足以满足90%的需求。 | 参数众多,初学者可能需要查阅文档。 |
channelartlist |
调用栏目列表,并在每个栏目下显示其子内容(文章/列表)。 | 结构清晰,一次循环搞定栏目和其内容,非常适合首页布局。 | 只能调用顶级栏目,灵活性不如 arclist。 |
dede:sql |
超复杂查询:需要联表查询、使用复杂函数或 arclist 无法实现的排序。 |
极度灵活,能实现任何数据库层面的操作。 | 有安全风险,代码可读性差,不易维护。不推荐新手使用。 |
给你的建议:
- 首选
arclist:当你需要调用指定栏目内容时,第一反应就应该是arclist,先去后台找到你要调用的栏目ID,然后使用typeid='X'参数。 - 检查模板缓存:修改了模板文件后,如果前台页面没有更新,请去后台“系统” -> “一键更新站点” -> “更新HTML”,并勾选“更新主页HTML”。
- 善用F12调试:如果调用的内容没有显示,使用浏览器开发者工具(按F12)检查HTML结构,看看标签是否被正确解析,或者是否有其他CSS/JS错误导致隐藏。
希望这份详细的指南能帮助你完美解决在DedeCMS中调用指定栏目内容的问题!
