织梦默认调用多局限于当前栏目,但实际建站中,首页、频道页常需要跨栏目聚合内容,如同时调用新闻与产品栏目。本文讲解几种跨栏目调用方法。
一、arclist跨栏目调用基础
{dede:arclist}通过typeid指定栏目,可传入单个或多个栏目ID,实现跨栏目调用:
{dede:arclist typeid='1,2,3' row='10' orderby='pubdate'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
多个ID用英文逗号分隔,会同时调用这几个栏目的文档。
二、调用指定栏目的子栏目
若想调用某顶级栏目下所有子栏目的内容,可用typeid='top'或在typeid中填顶级栏目ID并配合type属性:
{dede:arclist typeid='10' row='10'}
...
{/dede:arclist}
默认会包含子栏目文档。若只想当前栏目不含子栏目,加type='self'。
三、排除指定栏目
需要调用全站最新内容但排除某些栏目时,可用typeid='all'配合noflag或自定义SQL。更直接的方式是用{dede:sql}:
{dede:sql sql="SELECT id,title FROM dede_archives WHERE typeid NOT IN(5,6) AND arcrank>-2 ORDER BY pubdate DESC LIMIT 10"}
<li>[field:title/]</li>
{/dede:sql}
四、频道页多区块聚合
频道页常按子栏目分块展示,每个区块调用一个子栏目。先用{dede:channel}列子栏目,再在每个区块用arclist调用:
{dede:channel type='son' typeid='10'}
<section>
<h2>[field:typename/]</h2>
{dede:arclist typeid='[field:id/]' row='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
</section>
{/dede:channel}
注意arclist嵌套在channel中时,需用[field:id/]动态传入栏目ID。
五、跨栏目调用附加字段
调用附加表字段需用addfields与channelid指定模型:
{dede:arclist typeid='5,6' addfields='price,spec' channelid='6' row='10'}
<li>[field:title/] - [field:price/]元</li>
{/dede:arclist}
跨栏目调用附加字段时,各栏目必须绑定同一模型,否则字段不通用。
六、调用栏目本身的单页内容
栏目的"栏目内容"(单页)用{dede:type}或{dede:sql}调用:
{dede:sql sql="SELECT content FROM dede_arctype WHERE id=10"}
[field:content/]
{/dede:sql}
常用于在频道页展示栏目介绍。
七、注意事项
- 跨栏目调用时,各栏目绑定的模型尽量一致,否则附加字段无法统一调用。
- 调用条数不宜过多,避免SQL压力,首页聚合每区块5—10条即可。
- 开启HTML生成的页面,跨栏目调用结果会被写死,内容更新后需重新生成。
- 跨栏目调用的排序字段要统一,如都用pubdate,否则排序混乱。
八、使用建议
建议把跨栏目调用集中在首页与频道页,详情页尽量只调用本栏目与相关内容,避免SQL过于复杂。对于多区块聚合的页面,可结合缓存或静态化降低数据库压力。合理规划栏目ID与模型绑定,能让跨栏目调用更顺畅,也能减少后期维护成本。