- 调用分类列表:获取所有产品分类的名称、链接、ID等信息。
- 调用分类下的产品列表:根据获取到的分类ID,分别调用每个分类下的产品列表进行展示。
下面我将为您提供最常用、最核心的代码示例,并详细解释其含义和用法。

(图片来源网络,侵删)
调用所有产品分类列表(一级分类)
这是最基础的需求,通常用于制作网站的“产品分类”导航栏或侧边栏。
代码示例
{dede:channel type='top' currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
代码详解
{dede:channel}:这是织梦调用栏目的核心标签。type='top':这是一个关键参数,表示只调用顶级栏目(也就是一级分类),如果你的产品分类是二级分类,你需要去掉这个参数或者调整它。currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a></li>":这是一个非常有用的参数。- 作用:当用户当前所在的页面是这个分类时,会自动使用这里的代码样式。
~typelink~:会被替换为当前分类的链接地址。~typename~:会被替换为当前分类的名称。class='thisclass':你可以自定义一个CSS类名,用来给当前分类添加高亮样式,比如改变颜色或加粗。
[field:typelink/]:在标签内部使用,用于获取并输出分类的链接地址。[field:typename/]:在标签内部使用,用于获取并输出分类的名称。
完整示例(带CSS样式)
<!-- HTML 结构 -->
<ul class="category-nav">
{dede:channel type='top' currentstyle="<li class='active'><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
<!-- CSS 样式 -->
<style>
.category-nav li {
display: inline-block;
margin-right: 15px;
}
.category-nav li a {
text-decoration: none;
color: #333;
}
.category-nav li.active a {
color: #ff6600; /* 高亮颜色 */
font-weight: bold;
}
</style>
调用分类及其下的产品列表(最常用)
这是最核心的需求,比如首页的产品展示区,通常需要“分类名称 + 该分类下的几款产品”的形式。
思路
- 使用
{dede:channelartlist}这个高级标签,它可以循环顶级栏目,并且可以直接获取到当前栏目的ID。 - 在
{dede:channelartlist}的内部,使用{dede:sql}根据当前栏目的ID去查询该分类下的产品。 - 为了代码整洁和可复用,推荐使用
{dede:include}将产品列表的调用代码写成单独的模板文件,然后引入。
直接在模板中编写(适合简单场景)
<!-- 循环所有顶级产品分类 -->
{dede:channelartlist typeid='0' row='10'}
<div class="product-category-box">
<!-- 1. 显示分类名称 -->
<h2><a href="[field:typelink/]">[field:typename/]</a></h2>
<!-- 2. 调用并显示该分类下的产品列表 -->
<ul class="product-list">
{dede:sql sql='SELECT * FROM `dede_archives` a JOIN `dede_addonproduct` p ON a.id = p.aid WHERE a.typeid = [field:id] AND a.arcrank > -1 ORDER BY a.pubdate DESC LIMIT 0,4'}
<li>
<!-- 产品图片,使用[field:litpic/] -->
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]">
</a>
<!-- 产品标题,使用[field:title/] -->
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:sql}
</ul>
</div>
{/dede:channelartlist}
代码详解
{dede:channelartlist}:typeid='0':表示调用所有顶级栏目,如果你想指定某些分类,可以写成typeid='1,3,5'。row='10':表示调用10个顶级分类。[field:id]:在内部,这个变量代表当前循环到的分类的ID。{dede:sql}正是利用这个ID去查询产品。
{dede:sql}:sql='...':在这里写自定义的SQL查询语句。SELECT * FROM ...:查询dede_archives(文章主表)和dede_addonproduct(产品附加表)的关联数据。WHERE a.typeid = [field:id]:这是关键,它筛选出属于当前分类的产品。AND a.arcrank > -1:这个条件很重要,它用于过滤掉被“禁用”或“待审核”的文章,只显示正常发布的内容。ORDER BY a.pubdate DESC:按发布时间倒序排列,最新的在最前面。LIMIT 0,4:限制只查询4条记录,也就是每个分类下显示4个产品,你可以根据需要修改。
[field:litpic/]:产品缩略图地址。[field:title/]。[field:arcurl/]:产品文章的完整URL链接。
使用模板包含(推荐,代码更清晰)
当产品列表的调用逻辑比较复杂时,直接写在模板里会很臃肿,推荐使用“包含文件”的方式。
第一步:创建产品列表模板文件

(图片来源网络,侵删)
在您的模板目录(通常是 /templets/default/)下创建一个新文件,product_list_item.htm。
product_list_item.htm 文件内容:
<ul class="product-list">
{dede:sql sql='SELECT * FROM `dede_archives` a JOIN `dede_addonproduct` p ON a.id = p.aid WHERE a.typeid = ~typeid~ AND a.arcrank > -1 ORDER BY a.pubdate DESC LIMIT 0,4'}
<li>
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]">
</a>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:sql}
</ul>
注意:这里我们把 [field:id] 换成了 ~typeid~,这是一个占位符,{dede:include} 在包含文件时,会用传入的实际值替换它。
第二步:在主模板中调用
{dede:channelartlist typeid='0' row='10'}
<div class="product-category-box">
<h2><a href="[field:typelink/]">[field:typename/]</a></h2>
<!-- 引入产品列表模板,并传递typeid参数 -->
{dede:include file='product_list_item.htm' typeid='[field:id]' /}
</div>
{/dede:channelartlist}
{dede:include} 标签的作用就是将 product_list_item.htm 的内容插入到这里,并且把当前分类的ID [field:id] 作为 typeid 参数传递过去,这样 product_list_item.htm 里的 ~typeid~ 就能被正确替换了,这种方式使主模板非常干净,易于维护。
常见问题与注意事项
- 分类ID和产品ID:确保你的产品模型使用的是正确的附加表名(如
dede_addonproduct),如果你的产品模型名称是“产品”,那么附加表名通常就是dede_addonproduct。 - SQL查询效率:
{dede:sql}虽然灵活,但直接写SQL语句需要注意性能,如果分类和产品数量非常多,建议尽量使用织梦官方提供的标签,因为它们通常有缓存机制,对于中小型网站,上述方法完全够用。 typeid参数:{dede:channelartlist}的typeid和{dede:channel}的typeid含义不同,前者是限定要循环哪些顶级分类,后者是限定要调用哪些分类(包括子分类,除非指定type='top')。- URL静态化:如果你的网站开启了URL静态化,
[field:arcurl/]和[field:typelink/]会自动生成.html后缀的静态链接。
希望这份详细的指南能帮助您在织梦CMS中完美地实现产品分类的展示!
