调用当前栏目的“兄弟栏目”内容
这是最常见的需求,你在一个产品分类下,想展示同级的其他产品列表。

(图片来源网络,侵删)
核心思路:
- 获取当前栏目的父ID (
topid或reid)。 - 使用这个父ID去查询所有具有相同父ID的栏目(即兄弟栏目)。
- 遍历这些兄弟栏目,并分别调用它们下面的文章列表。
方法 A:使用 dede:arclist 标签(推荐,性能好)
这是最常用且最高效的方法,直接在模板文件中通过SQL语句实现。
{dede:arclist}
<ul>
{dede:sql sql='
SELECT id, typename
FROM `dede_arctype`
WHERE reid = ~typeid~
AND ishidden = 0
ORDER BY sortrank
'}
<li>
<a href="[field:typelink/]]" title="[field:typename/]">[field:typename/]</a>
<!-- 下面再嵌套一个 arclist 来调用该兄弟栏目下的文章 -->
{dede:arclist row='5' titlelen='30' typeid='[field:id/]'}
<ul>
<li><a href="[field:arcurl/]">[field:title/]</a></li>
</ul>
{/dede:arclist}
</li>
{/dede:sql}
</ul>
{/dede:arclist}
代码解析:
{dede:sql ...}:这是一个执行自定义SQL的标签。sql='...':里面的SQL语句是核心。SELECT id, typename FROM dede_arctype:从栏目表dede_arctype中查询栏目的ID和名称。WHERE reid = ~typeid~:这是关键。reid是栏目的父级ID。~typeid~是DedeCMS的一个特殊变量,代表当前页面的栏目ID,这里我们用它来获取当前栏目的父ID,从而筛选出所有兄弟栏目。AND ishidden = 0:排除隐藏的栏目。ORDER BY sortrank:按照后台设置的排序进行排列。
[field:typelink/]:{dede:sql}标签内可以使用field:来获取SQL查询返回的字段。typelink是DedeCMS内置的函数,会自动生成栏目的链接(如/a/abc/)。- 嵌套
{dede:arclist}:在{dede:sql}循环的内部,我们再次使用{dede:arclist},并将typeid设置为当前兄弟栏目的id([field:id/]),这样就实现了调用每个兄弟栏目下的文章列表。
方法 B:使用 {dede:channelartlist} 标签(更结构化)
如果你希望每个兄弟栏目及其文章作为一个区块来展示,channelartlist 是一个很好的选择。

(图片来源网络,侵删)
{dede:channelartlist typeid='~reid~'}
<h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
<ul>
{dede:arclist row='5' titlelen='30'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
</ul>
{/dede:channelartlist}
代码解析:
{dede:channelartlist ...}:这个标签用于循环输出指定栏目及其子栏目。typeid='~reid~':这是它的灵魂所在。typeid属性用来指定起始栏目。~reid~变量代表当前栏目的父级ID,typeid='~reid~'的意思就是“以我的父栏目为起点,循环输出它下面的所有直接子栏目(也就是我的兄弟栏目)”。{dede:field name='typeurl'/}和{dede:field name='typename'/}:在channelartlist循环内部,通过field:变量可以获取到当前循环到的栏目的链接和名称。- 内部的
{dede:arclist}:它会默认调用当前循环栏目(即兄弟栏目)下的文章列表,无需再指定typeid。
调用当前栏目的“父栏目”内容
这个需求相对简单,因为父栏目只有一个。
方法:使用 {dede:sql}
{dede:sql sql='
SELECT id, typename, description
FROM `dede_arctype`
WHERE id = ~reid~
AND ishidden = 0
LIMIT 1
'}
<h1><a href="[field:typelink/]]" title="[field:typename/]">[field:typename/]</a></h1>
<p>[field:description function='htmlspecialchars(@me)'/]</p>
{/dede:sql}
代码解析:
WHERE id = ~reid~:直接查询当前栏目的父级ID (reid) 对应的栏目信息。
LIMIT 1:确保只返回一条记录,因为父栏目是唯一的。
调用当前栏目的“子栏目”内容
这个需求也很常见,通常用于制作主导航下的子导航和文章列表。
(图片来源网络,侵删)
方法:使用 {dede:channelartlist}
这和调用兄弟栏目的方法几乎一样,只是变量不同。
{dede:channelartlist typeid='~typeid~'}
<h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
<ul>
{dede:arclist row='5' titlelen='30'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
</ul>
{/dede:channelartlist}
代码解析:
typeid='~typeid~':这里我们使用 ~typeid~,即当前栏目的ID。channelartlist 会以当前栏目为父级,循环输出它的所有直接子栏目。
总结与最佳实践
需求场景
推荐标签
关键参数/变量
说明
调用兄弟栏目
{dede:channelartlist}
typeid='~reid~'
结构清晰,适合做区块式展示。
调用兄弟栏目
{dede:sql} + {dede:arclist}
WHERE reid = ~typeid~
灵活,可以自定义SQL,性能优异。
调用父栏目
{dede:sql}
WHERE id = ~reid~
简单直接,获取单个父栏目信息。
调用子栏目
{dede:channelartlist}
typeid='~typeid~'
最标准、最常用的调用子栏目方法。
重要提示:
- 变量:
~typeid~ (当前栏目ID) 和 ~reid~ (当前栏目的父级ID) 是DedeCMS模板中的核心变量,务必理解它们的区别。
- 表前缀:如果你的数据表前缀不是默认的
dede_,请记得将SQL语句中的 dede_arctype 修改成你自己的表前缀。
- 缓存:DedeCMS有强大的缓存机制,在修改模板后,如果前台页面没有立即更新,请到后台 [系统] -> [一键更新缓存] 或 [生成] -> [更新HTML],选择“更新所有”或“更新栏目缓存”。
- 性能:
{dede:sql} 执行的是原生SQL,效率很高,尽量避免在循环中使用过多或过于复杂的查询。
希望这份详细的指南能帮助你解决在DedeCMS中调用交叉栏目内容的问题!
{dede:sql sql='
SELECT id, typename, description
FROM `dede_arctype`
WHERE id = ~reid~
AND ishidden = 0
LIMIT 1
'}
<h1><a href="[field:typelink/]]" title="[field:typename/]">[field:typename/]</a></h1>
<p>[field:description function='htmlspecialchars(@me)'/]</p>
{/dede:sql}
代码解析:
WHERE id = ~reid~:直接查询当前栏目的父级ID (reid) 对应的栏目信息。LIMIT 1:确保只返回一条记录,因为父栏目是唯一的。
调用当前栏目的“子栏目”内容
这个需求也很常见,通常用于制作主导航下的子导航和文章列表。

(图片来源网络,侵删)
方法:使用 {dede:channelartlist}
这和调用兄弟栏目的方法几乎一样,只是变量不同。
{dede:channelartlist typeid='~typeid~'}
<h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
<ul>
{dede:arclist row='5' titlelen='30'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
</ul>
{/dede:channelartlist}
代码解析:
typeid='~typeid~':这里我们使用 ~typeid~,即当前栏目的ID。channelartlist 会以当前栏目为父级,循环输出它的所有直接子栏目。
总结与最佳实践
需求场景
推荐标签
关键参数/变量
说明
调用兄弟栏目
{dede:channelartlist}
typeid='~reid~'
结构清晰,适合做区块式展示。
调用兄弟栏目
{dede:sql} + {dede:arclist}
WHERE reid = ~typeid~
灵活,可以自定义SQL,性能优异。
调用父栏目
{dede:sql}
WHERE id = ~reid~
简单直接,获取单个父栏目信息。
调用子栏目
{dede:channelartlist}
typeid='~typeid~'
最标准、最常用的调用子栏目方法。
重要提示:
- 变量:
~typeid~ (当前栏目ID) 和 ~reid~ (当前栏目的父级ID) 是DedeCMS模板中的核心变量,务必理解它们的区别。
- 表前缀:如果你的数据表前缀不是默认的
dede_,请记得将SQL语句中的 dede_arctype 修改成你自己的表前缀。
- 缓存:DedeCMS有强大的缓存机制,在修改模板后,如果前台页面没有立即更新,请到后台 [系统] -> [一键更新缓存] 或 [生成] -> [更新HTML],选择“更新所有”或“更新栏目缓存”。
- 性能:
{dede:sql} 执行的是原生SQL,效率很高,尽量避免在循环中使用过多或过于复杂的查询。
希望这份详细的指南能帮助你解决在DedeCMS中调用交叉栏目内容的问题!
这和调用兄弟栏目的方法几乎一样,只是变量不同。
{dede:channelartlist typeid='~typeid~'}
<h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
<ul>
{dede:arclist row='5' titlelen='30'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
</ul>
{/dede:channelartlist}
代码解析:
typeid='~typeid~':这里我们使用~typeid~,即当前栏目的ID。channelartlist会以当前栏目为父级,循环输出它的所有直接子栏目。
总结与最佳实践
| 需求场景 | 推荐标签 | 关键参数/变量 | 说明 |
|---|---|---|---|
| 调用兄弟栏目 | {dede:channelartlist} |
typeid='~reid~' |
结构清晰,适合做区块式展示。 |
| 调用兄弟栏目 | {dede:sql} + {dede:arclist} |
WHERE reid = ~typeid~ |
灵活,可以自定义SQL,性能优异。 |
| 调用父栏目 | {dede:sql} |
WHERE id = ~reid~ |
简单直接,获取单个父栏目信息。 |
| 调用子栏目 | {dede:channelartlist} |
typeid='~typeid~' |
最标准、最常用的调用子栏目方法。 |
重要提示:
- 变量:
~typeid~(当前栏目ID) 和~reid~(当前栏目的父级ID) 是DedeCMS模板中的核心变量,务必理解它们的区别。 - 表前缀:如果你的数据表前缀不是默认的
dede_,请记得将SQL语句中的dede_arctype修改成你自己的表前缀。 - 缓存:DedeCMS有强大的缓存机制,在修改模板后,如果前台页面没有立即更新,请到后台 [系统] -> [一键更新缓存] 或 [生成] -> [更新HTML],选择“更新所有”或“更新栏目缓存”。
- 性能:
{dede:sql}执行的是原生SQL,效率很高,尽量避免在循环中使用过多或过于复杂的查询。
希望这份详细的指南能帮助你解决在DedeCMS中调用交叉栏目内容的问题!
