这个函数非常强大,它可以通过指定一个栏目ID和是否包含子栏目的参数,来精确地获取文章总数。

(图片来源网络,侵删)
下面我将为你提供几种常见的场景和对应的代码实现。
核心函数:GetTotalArc()
function GetTotalArc($typeid, $isunit = 0)
$typeid: 栏目ID,这是必需参数。$isunit: 是否包含子栏目。0(默认值): 不包含子栏目,只统计当前栏目ID下的文章数。1: 包含所有子栏目,统计当前栏目ID及其所有下级栏目下的文章总数。
在当前栏目页(list_article.htm)中统计
这是最常见的需求,在列表页的页眉或页脚显示“本栏目共 X 篇文章,含子栏目共 Y 篇”。
假设你的列表页模板是 list_article.htm。
方法1:直接在模板中调用(最简单)
在 list_article.htm 模板文件中,直接使用以下代码:

(图片来源网络,侵删)
<!-- 统计当前栏目(不含子栏目)的文章数 -->
当前栏目 <strong>{dede:field name='typename'/}</strong> 共有 <strong>{dede:field name='total'/}</strong> 篇文章。
<!-- 统计当前栏目(含所有子栏目)的文章数 -->
包含所有子栏目,共有 <strong><?php echo GetTotalArc($GLOBALS['typeid'], 1); ?></strong> 篇文章。
代码解释:
{dede:field name='typename'/}: 输出当前栏目的名称。{dede:field name='total'/}: 这是DedeCMS列表页自带的变量,它默认只统计当前栏目(不含子栏目)的文章数,效果和GetTotalArc($GLOBALS['typeid'], 0)一样。$GLOBALS['typeid']: 这是PHP的全局变量,在列表页中它存储了当前栏目的ID,我们通过它来获取ID,然后传递给GetTotalArc()函数。<?php echo ... ?>: 这是在DedeCMS模板中嵌入PHP代码的标准方式。
方法2:在PHP文件中处理(更灵活)
如果你想更复杂地处理这个数据,或者想在非列表页使用,可以在PHP文件中进行计算,在 include/typelink.class.php 或者自定义的标签文件中。
但通常情况下,直接在模板中调用就足够了。
在首页(index.htm)或其他页面中统计
如果你想在首页的某个位置,网站栏目导航”旁边,显示每个栏目及其子栏目的文章数,你需要使用自定义循环标签。

(图片来源网络,侵删)
示例:在首页显示一级栏目及其子栏目的文章数
在 index.htm 模板中,使用 {dede:channel} 循环标签,并结合PHP代码。
{dede:channel type='top' row='8'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
<!-- 统计当前一级栏目(不含子栏目)的文章数 -->
(不含子栏目: <?php echo GetTotalArc($typeid, 0); ?>)
<!-- 统计当前一级栏目(含所有子栏目)的文章数 -->
(含子栏目: <?php echo GetTotalArc($typeid, 1); ?>)
</li>
{/dede:channel}
代码解释:
{dede:channel type='top' row='8'}: 这是一个循环标签,用于获取顶级(一级)栏目。type='top': 指定只获取顶级栏目。row='8': 指定获取8个栏目。
[field:typelink/]: 输出栏目的链接地址。[field:typename/]: 输出栏目的名称。$typeid: 在{dede:channel}循环的上下文中,$typeid变量会自动循环赋值为每个栏目的ID,所以可以直接在PHP代码中使用。
页(article_article.htm)中统计
页,你可能想显示这篇文章所属的栏目及其上级栏目的文章数。
在 article_article.htm 模板中:
<!-- 显示当前文章所属栏目的文章数(不含子栏目) -->
本文所属栏目 <strong>{dede:field name='typename'/}</strong> 共有 <strong>{dede:field name='total'/}</strong> 篇文章。
<!-- 显示当前文章所属栏目的文章数(含子栏目) -->
包含子栏目共有 <strong><?php echo GetTotalArc($GLOBALS['typeid'], 1); ?></strong> 篇文章。
代码解释:
页,$GLOBALS['typeid'] 同样指向当前文章所属栏目的ID,所以用法和列表页完全一样。
总结与注意事项
- 首选
GetTotalArc(): 这个函数是DedeCMS官方提供的,专门用于此目的,稳定且高效。 - 理解
$typeid的来源:- 在列表页和内容页,使用
$GLOBALS['typeid']来获取当前栏目的ID。 - 在
{dede:channel}等循环标签内部,直接使用$typeid即可,它会自动循环。
- 在列表页和内容页,使用
- 模板中的PHP代码: 记住在模板中写PHP代码时,要用
<?php ... ?>包裹起来。 - 性能考虑:
GetTotalArc()函数每次调用都会执行一次SQL查询来计算总数,如果你的网站栏目非常多,并且在首页一次性显示所有栏目的文章数,可能会对数据库造成一定压力,但对于中小型网站,这种影响微乎其微,无需担心。
通过以上方法,你就可以灵活地在 DedeCMS 5.7 的任何页面中统计当前栏目和下级栏目的文章数量了。
