使用SQL直接查询(最推荐、最灵活)
这是最直接、最高效的方法,通过自定义SQL语句,我们可以一次性获取当前栏目及其所有副栏目的文章。

(图片来源网络,侵删)
适用场景:
- 需要完全自定义调用逻辑,不受限于默认标签。
- 对性能有一定要求,希望减少数据库查询次数。
- 需要复杂的排序或筛选条件。
操作步骤:
-
找到并打开你的列表页模板文件。 这个文件通常位于
/templets/你的栏目目录/ list_article.htm。 -
在需要调用副栏目文章的位置,添加以下代码:
(图片来源网络,侵删)
{dede:sql sql='
SELECT
a.id, a.title, a.litpic, a.description, a.pubdate, a.typeid, t.typename, t.isdefault, t.namerule, t.moresite, t.siteurl, t.sitepath, t.ispart, t.core, t.addtable, a.arcrank, a.click, a.money
FROM
`#@__archives` a
LEFT JOIN
`#@__arctype` t ON a.typeid = t.id
WHERE
a.typeid IN ([!--thisid--], (SELECT pid FROM `#@__arctype` WHERE id = [!--thisid--]))
ORDER BY
a.sortrank DESC, a.id DESC
LIMIT
0, 10
'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span class="date">([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
</li>
{/dede:sql}
代码详解:
{dede:sql ...}:这是DedeCMS的自定义SQL查询标签。SELECT ... FROM ...:标准的SQL查询语句,我们选择了文章表(#@__archives)和栏目表(#@__arctype)的相关字段。a.typeid IN ([!--thisid--], (SELECT pid FROM#@__arctypeWHERE id = [!--thisid--])):这是SQL的核心。[!--thisid--]:这是DedeCMS的内置变量,代表当前栏目的ID。IN (...):表示typeid字段的值在括号内的任意一个。[!--thisid--]:匹配当前栏目本身。(SELECT pid FROM#@__arctypeWHERE id = [!--thisid--]):这是一个子查询,它会查找当前栏目ID的父栏目ID(pid),在DedeCMS中,副栏目是通过将一个栏目的父ID(pid)设置为目标栏目的ID来实现的,所以这个子查询的结果就是当前栏目的所有副栏目的ID。- 注意:这个SQL假设副栏目的数量只有一个(即一个父栏目对应一个子栏目作为副栏目),如果支持多个副栏目,更健壮的写法是查询副栏目表
#@__arctype中topid字段等于当前栏目ID的记录,请根据你的实际栏目结构调整。
ORDER BY a.sortrank DESC, a.id DESC:按文章的排序值和ID降序排列,这是DedeCMS的默认排序方式。LIMIT 0, 10:限制查询结果为10条,你可以根据需要修改。[field:arcurl/]和[field:title/]:在SQL查询结果中,可以直接使用field标签来输出字段值。arcurl是一个特殊字段,会自动生成文章的完整链接。
使用 channel 标签循环调用(简单易用)
如果你的副栏目数量不多,并且希望保持模板的“织梦风格”,可以循环调用每个副栏目,然后再在每个副栏目下调用文章。
适用场景:
- 副栏目数量较少(例如1-3个)。
- 希望代码结构清晰,易于理解和维护。
- 对性能要求不高。
操作步骤:

(图片来源网络,侵删)
-
打开列表页模板文件 (
/templets/你的栏目目录/ list_article.htm)。 -
添加以下代码:
<!-- 调用当前栏目和所有副栏目的文章 -->
{dede:channel type='son' currentid='[!--thisid--]'}
<div class="sub-channel-list">
<h3>栏目:[field:typename/]</h3>
<ul>
{dede:arclist row='8' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
</ul>
</div>
{/dede:channel}
代码详解:
{dede:channel type='son' currentid='[!--thisid--]'}:type='son':表示获取当前栏目的“子栏目”,在DedeCMS的栏目体系中,副栏目就是通过设置子栏目来实现的。currentid='[!--thisid--]':指定当前栏目ID,确保只获取当前栏目的子栏目。
[field:typename/]:输出子栏目的名称。{dede:arclist ...}:在channel标签的循环体内,使用arclist标签来调用该子栏目下的文章。row='8':每个副栏目调用8篇文章。titlelen='30'长度限制为30个字符。
优点:代码结构清晰,符合织梦标签的使用习惯。 缺点:如果副栏目很多,会产生多次数据库查询,性能较差。
使用 getarclist 函数(进阶方法)
这个方法与方法一类似,但使用了PHP函数的方式,在某些模板引擎(如早期版本)或需要更复杂逻辑时可能更方便。
操作步骤:
-
打开列表页模板文件。
-
添加以下代码:
{dede:getarclist typeid='[!--thisid--],~son' row='10' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span class="date">([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
</li>
{/dede:getarclist}
代码详解:
{dede:getarclist ...}:调用文章列表的函数标签。typeid='[!--thisid--],~son':这是关键。[!--thisid--]:包含当前栏目。~son:这是一个特殊用法,表示包含当前栏目的所有“子栏目”(即副栏目)。
row='10':总共调用10篇文章,len='30'`:标题长度限制。
优点:标签简洁,一行代码搞定。
缺点:灵活性不如直接写SQL,且 ~son 的性能可能不如优化的SQL查询。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| SQL查询 | 性能最好、最灵活、功能强大 | 需要懂一些SQL语法,代码稍复杂 | ⭐⭐⭐⭐⭐ (强烈推荐) |
channel循环 |
代码结构清晰、易于理解 | 副栏目多时性能差、代码冗余 | ⭐⭐⭐ (适合少量副栏目) |
getarclist |
代码非常简洁 | 灵活性差,性能一般 | ⭐⭐ (备选方案) |
最终建议:
对于绝大多数网站,方法一(SQL查询)是最佳选择,它既保证了性能,又提供了足够的灵活性,是专业开发者的首选,如果你只是临时做一个简单的网站,副栏目也只有一个,那么方法二也是一个不错的选择。
