使用 channelartlist 标签(推荐,最灵活)
这是最推荐、最灵活的方法。channelartlist 标签可以循环指定的一组栏目,并在每个栏目循环内部使用 list 标签来调用该栏目的文章,我们可以利用它来同时调用当前栏目和上级栏目。

适用场景: 在当前栏目的列表页,同时显示当前栏目的文章列表和上级栏目的文章列表。
实现步骤:
-
获取当前栏目的ID和上级栏目的ID。 在织梦模板中,可以通过
typeid变量获取当前栏目ID,通过topid变量获取顶级栏目ID,通过reid变量获取直接上级栏目ID,我们需要的是reid。 -
使用
channelartlist 我们将当前栏目ID和上级栏目ID组合起来,传递给channelartlist的typeid属性。
(图片来源网络,侵删)
代码示例:
假设您想在列表页的上方,先显示上级栏目的几篇文章,然后再显示当前栏目的文章列表。
{dede:channelartlist typeid='[field:reid],[field:typeid]'}
<!-- 第一个循环:上级栏目 -->
<div class="parent-channel">
<h2><a href="[field:typeurl/]">[field:typename/]</a> (上级栏目)</h2>
<ul>
{dede:list pagesize='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:list}
</ul>
</div>
<!-- 第二个循环:当前栏目 -->
<div class="current-channel">
<h2><a href="[field:typeurl/]">[field:typename/]</a> (当前栏目)</h2>
<ul>
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:list}
</ul>
<!-- 如果需要分页,把分页代码放在所有循环的外面 -->
<!-- {dede:pagelist listsize='4' listitem='pre,next,end,option,info'/} -->
</div>
{/dede:channelartlist}
代码解释:
typeid='[field:reid],[field:typeid]': 这是核心,它告诉channelartlist标签要循环两个栏目:第一个是当前栏目的上级栏目(reid),第二个是当前栏目本身(typeid)。{dede:channelartlist}...{/dede:channelartlist}: 这个大循环会执行两次,分别对应上级栏目和当前栏目。[field:typeurl/]和[field:typename/]: 在循环内部,这两个变量会随着当前循环的栏目而改变,分别显示栏目的链接和名称。{dede:list}: 在channelartlist内部使用list标签来调用该栏目的文章列表。- 注意: 分页标签
{dede:pagelist}应该放在channelartlist的外面,而不是在某个list循环的内部,因为整个channelartlist的内容都属于当前栏目列表页。
直接使用 sql 查询标签(最直接,性能最好)
如果您只想简单地调用上级栏目的几篇文章,不涉及复杂的循环逻辑,直接使用 sql 标签查询数据库是最直接的方法。

适用场景: 只需要在页面的某个特定位置(如侧边栏)显示上级栏目的几篇文章。
实现步骤:
-
编写SQL查询语句。 语句需要:
从 dede_archives 表中查询,条件是所属栏目ID等于当前栏目的上级栏目ID,并按发布时间降序排序,限制数量为5条。 -
使用
{dede:sql}标签执行查询。
代码示例:
<h2>推荐文章(来自上级栏目)</h2>
<ul>
{dede:sql sql="SELECT id, title, pubdate FROM dede_archives WHERE typeid = ~reid~ ORDER BY pubdate DESC LIMIT 0,5"}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:sql}
</ul>
代码解释:
sql="...": 这里是标准的SQL查询语句。typeid = ~reid~: 这是关键。~reid~是织梦模板引擎的一个特殊用法,它会自动替换为当前栏目的reid(上级栏目ID)值,注意是波浪线 ,不是单引号 。LIMIT 0,5: 表示从第0条记录开始,获取5条记录。[field:arcurl/]: 在sql标签中,arcurl需要通过函数GetArcUrl(@id)来生成,织梦默认支持[field:arcurl/],但如果出现问题,可以使用[field:id function='GetArcUrl(@me)'/]。
使用 list 标签的 typeid 属性(最简单)
如果您的页面结构非常简单,只是想在当前栏目文章列表的旁边,再列一个上级栏目的文章块,可以直接使用两个独立的 适用场景: 页面布局简单,只需要并排显示两个栏目的文章列表。 代码示例: 代码解释: 对于绝大多数情况,方法一 (list
<div class="main-content">
<!-- 当前栏目文章列表 -->
<div class="current-list">
<h2>当前栏目文章</h2>
{dede:list pagesize='10'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:list}
</div>
<!-- 上级栏目文章列表 -->
<div class="parent-list">
<h2>上级栏目推荐</h2>
{dede:list typeid='[field:reid]' pagesize='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:list}
</div>
</div>
{dede:list typeid='[field:reid]'}: 在第二个 list 标签中,通过 typeid 属性直接指定了要调用的栏目ID为当前栏目的上级栏目ID [field:reid]。
总结与选择建议
方法
优点
缺点
适用场景
channelartlist最灵活,代码结构清晰,易于管理,符合织梦标签哲学。
语法稍复杂,需要理解嵌套循环。
强烈推荐,需要在同一页面展示多个栏目文章列表的复杂布局。
sql性能最好,直接查询数据库,效率高。
需要懂SQL,可读性稍差,硬编码了表名(
dede_archives)。只需要在页面某个角落调用少量上级栏目文章,如侧边栏、推荐位。
list最简单,代码直观,容易理解。
会触发多次查询,对于复杂页面可能不够优雅。
页面布局非常简单,只需要并排显示两个栏目文章列表的初级需求。
channelartlist) 是最佳选择,因为它既灵活又高效,并且是织梦官方推崇的用法。
