今天聊聊dedecms里一个挺实际的需求,就是循环调用栏目,并且把栏目的SEO信息,比如标题、关键词、描述这些给带出来。这活儿说简单也简单,但想用得顺手,还真得琢磨一下。
很多站长朋友做网站,首页或者一些聚合页面,需要把各个栏目的链接和名称列出来,做成导航或者展示区块。光是调用栏目名和链接还不够,最好能把后台为每个栏目单独设置的SEO标题、关键词也调用出来,这样对页面优化更有帮助。dedecms后台在“网站栏目管理”里,每个栏目都有“SEO标题”、“关键词”、“栏目描述”这几个高级选项,我们需要的就是把它们在前台页面里展示出来。
想实现子栏目及其内容的循环展示,channelartlist标签是首选。这个标签挺强大,支持嵌套调用,可以说是dedecms里为数不多能这么玩的标签。
一个基础的结构是这样的:
{dede:channelartlist}<div>
<h3><a href="dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h3>
<p>SEO标题:{dede:field.seotitle /}</p>
<p>关键词:{dede:field.keywords /}</p>

<p>栏目描述:{dede:field.description /}</p>
<ul>
{dede:arclist titlelen='60' row='5'}
<li><a href="[field:arcurl /]">[field:title /]</a></li>
{/dede:arclist}
</ul>
</div>
{/dede:channelartlist}
这段代码放在首页模板里,就能把指定父栏目下的所有子栏目循环出来,每个子栏目块里显示它的名称、链接、SEO信息,以及该栏目下的最新5篇文章列表。
这里注意几个点:
1. `{dede:field.seotitle /}` 就是调用栏目的SEO标题,如果后台没填,它会自动 fallback 到栏目名称。
2. `{dede:field.keywords /}` 和 `{dede:field.description /}` 同理,调用后台设置的关键词和描述。
3. `{dede:arclist}` 嵌套在里面,用来调取该栏目下的文章,`row='5'`控制调用的文章数量。
channelartlist标签有几个重要参数,用对了地方效果才好。
所以,根据页面不同,用法要变:
首页使用:通常 `typeid` 可以指定某些大分类,或者用 `typeid='top'` 来调用所有顶级栏目及其子内容。
列表页使用:如果你想在某个栏目的列表页侧边栏,展示它的兄弟栏目或者其他相关栏目,就需要明确指定 `typeid` 为某个父栏目ID,不能依赖“当前栏目”。
有时候页面布局不需要显示文章列表,只想把栏目及其SEO信息以某种形式(比如表格)列出来。这时可以不用嵌套arclist,直接用channel标签或者sql标签。
用channel标签循环子栏目:
{dede:channel type='son' row='10'}<tr>
<td><a href="[field:typelink/]">[field:typename/]</a></td>
<td>[field:seotitle/]</td>
<td>[field:keywords/]</td>
</tr>
{/dede:channel}
但注意,默认的channel标签可能不能直接调用seotitle字段,需要确认。更直接的方法是使用sql标签,自由度最高:
{dede:sql sql='Select id,typename,seotitle,keywords,description from dede_arctype where reid=0 order by sortrank'}<tr>
<td><a href=".php?tid=[field:id/]"gt;[field:typename/]</a></td>
<td>[field:seotitle/]</td>
<td>[field:keywords/]</td>
<td>[field:description/]</td>
</tr>
{/dede:sql}
这里 `reid=0` 表示调用所有顶级栏目。你可以随意修改SQL语句,想调什么栏目,按什么顺序,都行。
为了更清楚,我们把这几种方法的核心区别和适用场景列一下:
| 调用方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| channelartlist | 功能强大,支持栏目与文章嵌套调用,样式控制灵活 | 在终极栏目页使用需注意参数,否则无输出 | 首页栏目聚合展示、需要同时显示栏目信息和其下文章的页面 |
| channel (type=‘son’) | 语法简单,专门用于调用当前栏目的子栏目列表 | 调用字段可能受限,默认不一定包含所有SEO字段 | 在栏目页侧边栏生成子栏目导航 |
| sql标签 | 最灵活,可调用任何字段,排序和条件完全自定义 | 需要懂一点SQL,写错可能导致页面报错 | 需要定制化字段调用、复杂排序或筛选逻辑时 |
说几个实际操作中容易碰到的问题。
第一个,SEO信息调用为空。 检查后台栏目设置里的“高级选项”,确认“SEO标题”、“关键词”、“栏目描述”这些字段是不是真的填了内容。如果没填,前台调用自然就是空的。有时候系统缓存也会导致新填的内容不显示,去后台更新一下系统缓存,再重新生成页面试试。
第二个,栏目顺序不对。 循环出来的栏目顺序,默认是按照后台“网站栏目管理”里的“排序”值(sortrank)升序排列的。如果你发现顺序乱了,就去后台调整那个栏目的“排序”值,数字小的排在前面。用sql标签的话,就在SQL语句最后加上 `order by sortrank asc`。
第三个,在内容页调用其他栏目的SEO信息。 这通常用在相关推荐模块。你不能直接用 `{dede:field.seotitle/}`,因为这是调用当前内容页的字段。你需要结合 `typeid` 指定栏目,或者用上面提到的sql标签。比如,你想在文章页侧边栏推荐“ID为5的栏目”及其SEO信息,可以这样:
{dede:channelartlist typeid='5'}<div class="related-channel">
<h4><a href="dede:field.typeurl/}"gt;{dede:field.typename/}</a></h4>
<p>{dede:field.description function='cn_substr(@me,120)'/}</p>
</div>
{/dede:channelartlist}
这里用到了一个 `function='cn_substr(@me,120)'`,这是dedecms的一个内置函数,意思是截取描述字段的前120个字符,防止描述太长破坏布局。
光把内容调用出来还不够,还得好看好用。这里简单提两点。
奇偶行不同样式:在列表展示时,让奇数行和偶数行背景色不同,看起来更清晰。这需要用到channelartlist的 `[field:global.autoindex/]` 这个变量,它表示当前循环的序号。
{dede:channelartlist}<div class="-item [field:global.autoindex/]2==0?'even':'odd'">
...
</div>
{/dede:channelartlist}
然后你在CSS里定义 `.odd` 和 `.even` 的样式就行了。不过dedecms模板里直接写PHP逻辑可能有点麻烦,更常见的做法是在输出后,用前端的JavaScript或CSS的 `:nth-child()` 选择器来控制。
调用栏目图片:有些模板需要为每个栏目配一张图。dedecms默认的栏目表没有图片字段,需要你手动添加。通过数据库管理工具,给 `dede_arctype` 表增加一个字段,比如叫 `typeimg`,然后在后台栏目管理的地方,修改对应模板文件(通常是catalog_add.htm和catalog_edit.htm),增加图片上传表单。最后,在前台调用时,使用 `[field:typeimg/]` 就能把图片地址调出来了。这个操作涉及修改程序和数据库,动手前务必备份。
总的来说,dedecms的栏目循环调用,核心就是理解 channelartlist、channel 和 sql 这几个标签的适用场合。把栏目的SEO信息融合进去,能让页面元素更丰富,对搜索引擎也更友好。关键是多试,根据自己网站的模板结构调整标签和参数,慢慢就熟练了。
本文由小艾于2026-04-28发表在爱普号,如有疑问,请联系我们。
本文链接:https://www.ipbcms.com/15022.html