首先获取当前栏目子栏目ID列表,若无则调用本栏目文章;接着通过灵动标签[e:loop]循环输出指定数据表中属于这些子栏目的最新文章,按时间倒序排列并限制数量;最后在支持PHP的模板中插入完整代码即可实现调用。需注意数据表名匹配、开启模板PHP支持及多级栏目扩展处理。

在使用帝国CMS建站时,经常需要在某个栏目页面中调用该栏目下所有子栏目的文章。这种需求常见于企业站、分类信息站等结构较复杂的网站。实现这一功能的关键在于正确获取当前栏目的子栏目ID,并通过灵动标签([e:loop])循环调用这些子栏目中的内容。
一、获取当前栏目下的所有子栏目ID
在模板中,首先要判断当前栏目是否有子栏目,并获取所有子栏目的ID列表,便于后续调用文章。可以使用以下PHP代码:
$zid = $class_r[$GLOBALS['navclassid']]['sonclass'];if ($zid) {
$zid = rtrim($zid, '|'); // 去掉末尾的竖线
$zids = explode('|', $zid); // 转为数组
$classid_in = implode(',', $zids); // 拼接成字符串用于SQL查询
} else {
$classid_in = $GLOBALS['navclassid']; // 若无子栏目,则调用当前栏目文章
}
这段代码的作用是:根据当前栏目ID($navclassid)读取其所有子栏目ID,如果没有子栏目,则默认调用当前栏目本身的文章。
二、使用灵动标签调用子栏目文章
在获取到子栏目ID列表后,使用[e:loop]标签进行文章调用。示例如下:
[e:loop={"select * from [!db.pre!]ecms_news where classid in ($classid_in) order by newstime desc limit 10",10,24,0}][/e:loop]
说明:
- 数据表名:示例中使用的是 ecms_news 表,若你的模型不同(如文章模型为其他自定义模型),请替换为对应的数据表名。
- classid in ($classid_in):确保只调用指定子栏目中的文章。
- order by newstime desc:按发布时间倒序排列。
- limit 10:限制调用10条记录。
三、完整模板调用示例(可直接使用)
将以下代码放入你需要显示子栏目文章的模板位置(如封面页、列表页):
php$zid = $class_r[$GLOBALS['navclassid']]['sonclass'];
if ($zid) {
$zid = rtrim($zid, '|');
$zids = explode('|', $zid);
$classid_in = implode(',', $zids);
} else {
$classid_in = $GLOBALS['navclassid'];
}
?>
[e:loop={"select * from [!db.pre!]ecms_news where classid in ($classid_in) order by newstime desc limit 10",10,24,0}]
[/e:loop]
注意:此代码需在支持PHP的模板中使用(如封面模板、列表模板),并且“开启模板支持PHP”必须在系统设置中启用。
四、常见问题与优化建议
实际使用中可能会遇到一些问题,以下是几个实用建议:
- 如果子栏目层级较深(如三级栏目),上述方法仅获取二级子栏目。如需递归获取所有子孙栏目,建议写一个递归函数处理$class_r数组。
- 调用标题时使用=esub($bqr['title'],30)?> 可限制字数,避免排版错乱。
- 若只想调用有文章的子栏目,可在SQL中添加“and id in (已发布内容ID)”条件进行过滤。
- 为提升性能,建议对频繁调用的内容做缓存处理,或使用静态化功能。
基本上就这些。只要掌握获取子栏目ID和灵活运用[e:loop]标签,就能轻松实现在当前栏目下调用所有子栏目文章的功能。不复杂但容易忽略细节,尤其是变量作用域和SQL语句拼接部分,务必测试确认。










