一篇文章可以同时属于主栏目和副栏目,并且当你在副栏目中浏览时,能够看到所有属于该副栏目的文章(无论它们的主栏目是什么)。
这需要两个步骤:
- 为文章设置副栏目(在后台发布或修改文章时)。
- 在前台模板中调用副栏目的关联文章(使用织梦的标签)。
第一步:为文章设置副栏目
这是实现功能的基础,织梦的文章模型本身就支持“副栏目”字段。
在后台发布/编辑文章时设置
- 登录织梦后台,进入“[内容]” -> “添加文章” 或 “编辑文章”。
- 在文章编辑页面,向下滚动,找到 “副栏目” 这个选项。
- 它通常是一个多选框,列出了你网站中所有的栏目。
- 选择 你希望这篇文章关联到的副栏目,可以选一个,也可以选多个。
- 发布或更新文章。
注意:一个文章必须有且仅有一个主栏目(在顶部“栏目选择”处选择),但可以有零个、一个或多个副栏目。
副栏目”选项不存在或不可用
极少数情况下,你可能需要检查一下:
- 检查文章模型:确保你使用的文章模型(在“频道模型”中设置)包含了“副栏目”这个字段,默认的“文章模型”是包含的。
- 检查权限:确保你当前账号有权限编辑文章和设置副栏目。
第二步:在前台模板中调用副栏目的关联文章
这是实现前台展示的关键,我们需要使用织梦的 {dede:arclist} 标签,并利用它的 typeid 和 addfields、 channelid 等属性。
假设我们要在 栏目A 的列表页模板(list_articlehtm)中,显示所有关联到 栏目A 的文章(这些文章的主栏目可能是B、C、D等)。
核心标签:{dede:arclist}
我们需要使用以下关键属性:
typeid='这里填副栏目的ID':这是最重要的参数,告诉织梦我们要获取哪个副栏目下的文章。addfields='type,mid':这个参数用于获取附加字段,因为我们要判断文章的主栏目是否等于当前栏目,所以需要获取文章的typeid(主栏目ID)和mid(模型ID,有时需要用到)。channelid='1':指定文章所在的频道ID。1通常代表“文章频道”,如果你的网站有自定义模型,请填写对应的频道ID。reid='0':表示不获取副栏目本身及其子栏目的文章,而是获取所有以该栏目为“副栏目”的文章,这是实现关联的核心。row='10':显示的文章数量。titlelen='30'长度。
示例代码
假设你在 list_article.htm 模板中,想在列表上方显示一个“相关文章”板块,这些文章的主栏目是其他栏目,但副栏目是当前栏目。
{dede:arclist typeid='这里替换成当前副栏目的ID' addfields='typeid,mid' channelid='1' reid='0' row='8' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span class="info">([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
</li>
{/dede:arclist}
问题来了:typeid='这里替换成当前副栏目的ID' 这个ID是固定的吗?不,我们需要动态获取当前栏目的ID。
如何动态获取当前栏目ID并调用?
织梦在列表页中,有一个内置变量 typeid,它就代表了当前页面的栏目ID,我们可以直接使用它。
最终的、可用的模板代码:
将下面的代码放到你想要显示关联文章的位置,list_article.htm 的循环之外。
<h3>相关栏目文章</h3>
<ul class="related-list">
{dede:arclist
typeid='[field:typeid/]'
addfields='typeid,mid'
channelid='1'
reid='0'
row='10'
titlelen='30'
orderby='pubdate'
orderway='desc'
}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<span class="date">([field:pubdate function="MyDate('m-d', @me)"/])</span>
</li>
{/dede:arclist}
</ul>
代码解释:
typeid='[field:typeid/]':这是动态获取当前栏目的ID,并将其作为副栏目ID进行查询。addfields='typeid,mid':获取文章的主栏目ID (typeid) 和模型ID (mid),虽然在这个例子中mid没用到,但加上typeid是为了代码的完整性和潜在扩展性。reid='0':这是实现“副栏目关联”的魔法,它告诉织梦不要找常规的子栏目,而是找所有dede_arctiny(或dede_archives) 表中typeid字段(主栏目)不等于当前栏目ID,但typeid2字段(副栏目)包含当前栏目ID 的文章。orderby='pubdate' orderway='desc':按发布时间倒序排列,让最新的文章显示在最前面。
总结与注意事项
- 功能本质:织梦通过
typeid(主栏目) 和typeid2(副栏目) 两个字段来实现这个功能。reid='0'是触发typeid2查询的关键。 - 后台设置:务必在后台为文章正确设置主栏目和副栏目,否则前台无法调用。
- 模板代码:核心是
{dede:arclist}标签的typeid和reid='0'的组合使用。 - 性能考虑:如果你的网站文章量非常大,且副栏目关联的文章也很多,这种查询可能会对数据库造成一定压力,建议合理设置
row值,不要一次调用过多文章。 - SEO影响:这个功能非常适合做“相关阅读”或“专题聚合”,可以有效增加网站的内链,对SEO非常有利,你可以做一个“技术分享”副栏目,然后将所有技术文章的主栏目设为不同的产品分类,但副栏目都勾选“技术分享”,然后在“技术分享”的列表页中,就能聚合所有技术文章。
通过以上步骤,你就可以在织梦CMS中完美实现“关联文章副栏目”的功能了。
