使用 channelartlist 标签(最推荐、最灵活)
channelartlist 是一个功能非常强大的标签,它可以循环指定的栏目列表,并且在循环内部可以自由调用该栏目的文章列表,使用它调用副栏目最为灵活和直观。

(图片来源网络,侵删)
适用场景:
在副栏目列表页(list_special_xxx.htm)中,循环调用该副栏目本身及其下的所有文章。
代码示例:
假设你已经在后台设置了“副栏目”,并且系统为你生成了对应的列表模板(list_special_1.htm,1 是副栏目的ID),你只需要在模板文件中写入以下代码:
{dede:channelartlist typeid='1' addfields='typename,seotitle'}
<h2>{dede:field name='typename'/}</h2>
<ul>
{dede:list pagesize='10' titlelen='50'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:list}
</ul>
<div class="dede_pages">
<ul>{dede:pagebreak/}</ul>
</div>
{/dede:channelartlist}
代码解析:

(图片来源网络,侵删)
-
{dede:channelartlist typeid='1' ...}typeid='1':这里的1是你副栏目本身的ID,你需要将1替换成你实际的副栏目ID。channelartlist会循环这个栏目本身。addfields='typename,seotitle':可选参数,用于获取栏目的附加字段,如栏目名称、SEO标题等。
-
{dede:field name='typename'/}- 在
channelartlist循环内部,用于获取当前循环的栏目的名称,也就是你的副栏目名称。
- 在
-
{dede:list ...}- 这是文章列表标签,它必须放在
channelartlist标签的内部。 - 它会自动列出
channelartlist所指定的栏目(也就是你的副栏目)下的所有文章。
- 这是文章列表标签,它必须放在
使用 arclist 标签(最常用、最简单)
如果你的需求只是简单地在一个位置(比如首页、其他栏目页)列出某个副栏目下的文章,arclist 标签是最佳选择。
适用场景:页或任何非列表页中,调用指定副栏目下的文章。
代码示例:
<h3>相关文章(来自副栏目)</h3>
<ul>
{dede:arclist typeid='1' row='8' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{dede:arclist}
</ul>
代码解析:
{dede:arclist typeid='1' ...}typeid='1':这是最关键的参数!这里的1就是你要调用的副栏目的ID,系统会自动找到这个ID下的所有文章。row='8':表示调用8篇文章。titlelen='30'最多显示30个字符。
页调用当前文章的副栏目及其文章
这个场景比较特殊,你想在文章详情页(article_article.htm)中,显示这篇文章所属的“副栏目”,并列出该副栏目下的其他文章。
代码示例:
{dede:field name='typeid' runphp='yes'}
$dsql = new DedeSql(false);
// 获取当前文章的副栏目ID,假设副栏目存储在附加表的 `fu` 字段
$typeid = @me;
$row = $dsql->GetOne("SELECT fu FROM `dede_archives` WHERE id='$typeid'");
$fu_id = $row['fu'];
// 如果存在副栏目
if($fu_id){
// 获取副栏目名称
$type_row = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id='$fu_id'");
$typename = $type_row['typename'];
// 输出副栏目标题和链接
@me = "<h4>相关栏目:<a href='/plus/list.php?tid=".$fu_id."'>".$typename."</a></h4>";
// 调用副栏目下的文章列表(排除当前文章)
$arc_id = $GLOBALS['arcid'];
$list = "";
$dsql2 = new DedeSql(false);
$dsql2->SetQuery("SELECT id,title FROM `dede_archives` WHERE typeid='$fu_id' AND id!='$arc_id' ORDER BY pubdate DESC LIMIT 5");
$dsql2->Execute('a');
while($row2 = $dsql2->GetArray('a')){
$list .= "<li><a href='/plus/view.php?aid=".$row2['id']."'>".$row2['title']."</a></li>";
}
@me .= "<ul>".$list."</ul>";
}else{
@me = ""; // 如果没有副栏目,则不显示任何内容
}
{/dede:field}
代码解析:
-
{dede:field name='typeid' runphp='yes'}- 这段代码的核心是
runphp='yes',它允许在模板中直接执行PHP代码。 @me在这里代表当前字段的值,即当前文章的栏目ID。
- 这段代码的核心是
-
查询副栏目ID:
- 代码首先查询
dede_archives表(文章主表),根据当前文章ID找到fu字段(如果你的副栏目字段名不是fu,请修改)的值,也就是副栏目的ID。
- 代码首先查询
-
获取副栏目信息并输出:
- 如果找到了副栏目ID,就再查询
dede_arctype表(栏目表)获取副栏目的名称。 - 然后拼接HTML代码,输出副栏目的标题和链接。
- 如果找到了副栏目ID,就再查询
-
调用副栏目下的文章:
- 再次查询
dede_archives表,找出属于该副栏目ID (typeid='$fu_id') 且不等于当前文章ID (id!='$arc_id') 的文章。 - 使用
LIMIT 5限制只显示5篇。 - 循环输出文章列表。
- 再次查询
重要前提:如何设置副栏目?
无论使用哪种方法,你首先必须在后台正确地为文章设置副栏目。
- 进入后台 -> 核心 -> 内容模型管理。
- 选择你正在使用的文章模型(通常是“文章”),点击后面的“管理字段”。
- 找到名为“副栏目”的字段,确保它的状态是“启用”。
- 发布或编辑文章时,在“常规选项”中,你就可以在“副栏目”的下拉菜单中选择一个或多个副栏目了。
总结与选择建议
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
channelartlist |
副栏目列表页 | 结构清晰,逻辑严谨,符合织梦模板规范 | 需要为副栏目创建独立的列表模板 |
arclist |
任意页面(首页、内容页等) | 简单、快捷、灵活 | 只能调用文章,不能直接获取副栏目本身的信息(如名称) |
runphp |
页调用关联信息 | 功能强大,可定制性极高 | 代码较复杂,需要懂PHP,对新手不友好 |
对于绝大多数情况,方法一和方法二已经足够解决你的问题,请根据你的具体页面位置选择合适的标签。
