使用 DedeCMS 自带功能(最简单)
这是最直接、最官方的方法,适用于后台管理和简单的前台调用。

(图片来源网络,侵删)
后台栏目管理
在 DedeCMS 后台的【栏目管理】中,默认情况下每个栏目名称后面都会显示其包含的文章数量。
- 路径:
后台 -> 栏目 -> 栏目管理 - 效果:你会看到类似
网站首页 (0)、公司动态 (12)、产品中心 (25)这样的显示,括号里的数字就是该栏目的文章数。
注意:这个数字默认只统计当前栏目的文章,不包含其所有子栏目的文章。
后台栏目列表(包含子栏目数量)
如果你想在后台的栏目列表中直接看到包含子栏目在内的总文章数,可以修改一个文件。
- 文件路径:
/dede/templets/catalog_main.htm - 修改方法:
- 用代码编辑器打开
catalog_main.htm文件。 - 找到显示栏目数量的代码行,通常在第 150 行左右,类似这样:
<td align="center"><?=$myrow->ispart?></td> <td align="center"><a href='catalog_do.php?dopost=listArchives&cid=<?=$myrow->id?>'><?=$myrow->id?></a></td> <td align='left'><a href='catalog_edit.php?cid=<?=$myrow->id?>'><u><?=$myrow->typename?></u></a></td> <td><?=$myrow->issystem?></td> <td><?=$myrow->norder?></td> <td><?=$myrow->channeltype?></td> <td align="center"><a href='catalog_add.php?cid=<?=$myrow->id?>'>[子栏目]</a> (<?=$myrow->arcnums?>)</td>
- 将
(<?=$myrow->arcnums?>)这部分修改为调用一个自定义函数来获取总数,我们需要先在文件顶部定义这个函数。 - 在文件
<head>标签后面或<body>标签后面添加如下 PHP 函数:<?php // 获取栏目及其所有子栏目的文章总数 function GetTotalArc($cid) { global $dsql; $total = 0; $query = "SELECT id FROM `#@__arctype` WHERE reid='$cid' OR topid='$cid'"; $dsql->SetQuery($query); $dsql->Execute(); while ($row = $dsql->GetArray()) { $total += GetTotalArc($row['id']); // 递归调用子栏目 } $query2 = "SELECT COUNT(*) as num FROM `#@__archives` WHERE typeid='$cid'"; $row2 = $dsql->GetOne($query2); $total += $row2['num']; return $total; } ?> - 将之前找到的
(<?=$myrow->arcnums?>)修改为:(<?=GetTotalArc($myrow->id)?>)
- 保存文件并上传到服务器,刷新后台栏目管理页面,你就会看到每个栏目后面都显示了包含子栏目在内的总文章数。
- 用代码编辑器打开
使用 SQL 查询(后台或手动查询)
如果你只是想快速查看某个栏目的总文章数,可以直接在数据库里查询。

(图片来源网络,侵删)
- 查询某个栏目及其所有子栏目的文章总数:
-- 将 {栏目ID} 替换为你想查询的栏目ID,5 SELECT COUNT(a.id) FROM `#@__archives` a INNER JOIN `#@__arctype` t ON a.typeid = t.id WHERE t.topid = {栏目ID} OR t.id = {栏目ID};这个查询会找到所有顶级ID或ID等于指定栏目的文章,并计数。
修改模板文件(前台页面调用)
这是最常用的前台页面显示方法,你可以在模板文件(.htm)中使用 DedeCMS 的标签和自定义函数来实现。
方法 3.1:使用 channel 标签 + 自定义函数(推荐)
这个方法灵活且不修改核心文件,升级后也不会丢失。
-
在模板文件中定义函数: 在你想要显示文章数量的模板文件(
index.htm或list_article.htm)的顶部,<head>标签之后,添加 PHP 函数:
(图片来源网络,侵删)<head>...</title> ... <?php // 获取栏目及其所有子栏目的文章总数 function GetTotalArc($cid) { global $dsql; $total = 0; // 获取当前栏目的文章数 $query = "SELECT COUNT(*) as num FROM `#@__archives` WHERE typeid='$cid'"; $row = $dsql->GetOne($query); $total += $row['num']; // 获取所有子栏目 $query2 = "SELECT id FROM `#@__arctype` WHERE reid='$cid'"; $dsql->SetQuery($query2); $dsql->Execute(); while ($row2 = $dsql->GetArray()) { // 递归调用,累加子栏目的文章数 $total += GetTotalArc($row2['id']); } return $total; } ?> </head> -
在模板中调用函数: 使用
{dede:channel}标签来循环栏目,并在其中调用我们刚刚定义的GetTotalArc函数。<ul> {dede:channel type='top' row='8'} <li> <a href="[field:typelink/]">[field:typename/]</a> <!-- 调用函数,传入当前栏目的ID ([field:id/]) --> (<span><?=GetTotalArc(@me)?></span>) </li> {/dede:channel} </ul>type='top'表示只调用顶级栏目。@me是当前标签的值,在这里就是[field:id/]的值,我们通过@me将其传递给自定义函数。
方法 3.2:使用 SQL 查询标签(更直接)
如果你不想写自定义函数,可以直接在模板里用 {dede:sql} 标签进行查询,这种方法更直接,但可读性稍差。
<ul>
{dede:channel type='top' row='8'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
<!-- 使用 sql 标签查询当前栏目及其子栏目的文章数 -->
(
{dede:sql sql='
SELECT COUNT(a.id)
FROM `#@__archives` a
INNER JOIN `#@__arctype` t ON a.typeid = t.id
WHERE t.topid = [field:id/] OR t.id = [field:id/]
'}
[field:count /]
{/dede:sql}
)
</li>
{/dede:channel}
</ul>
- 注意:
{dede:sql}标签中的[field:id/]是外层{dede:channel}标签的变量,它会正确地被替换为当前循环到的栏目的ID。
总结与建议
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方案一(后台修改) | 一次修改,后台全局可见,方便管理。 | 需要修改核心文件,升级网站后可能被覆盖。 | 需要经常在后台查看和管理栏目文章数的站长。 |
| 方案二(SQL查询) | 快速、准确,适合一次性数据检查。 | 无法在前台页面直接使用,需要手动操作。 | 后台数据分析,或调试时快速核对数据。 |
| 方案三(模板调用) | 最推荐,灵活、不伤核心文件、可移植性强。 | 需要在每个模板文件中重复定义函数(或使用公共模板文件)。 | 绝大多数前台页面显示需求。 |
对于大多数用户来说,方案三(方法3.1)是最佳选择,因为它既实现了功能,又保持了系统的安全性和可维护性。
