dede如何精准统计各栏目文章数量?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 DEDE建站 正文

使用 DedeCMS 自带功能(最简单)

这是最直接、最官方的方法,适用于后台管理和简单的前台调用。

dede 栏目文章数量统计
(图片来源网络,侵删)

后台栏目管理

在 DedeCMS 后台的【栏目管理】中,默认情况下每个栏目名称后面都会显示其包含的文章数量。

  • 路径后台 -> 栏目 -> 栏目管理
  • 效果:你会看到类似 网站首页 (0)公司动态 (12)产品中心 (25) 这样的显示,括号里的数字就是该栏目的文章数。

注意:这个数字默认只统计当前栏目的文章,不包含其所有子栏目的文章。

后台栏目列表(包含子栏目数量)

如果你想在后台的栏目列表中直接看到包含子栏目在内的总文章数,可以修改一个文件。

  • 文件路径/dede/templets/catalog_main.htm
  • 修改方法
    1. 用代码编辑器打开 catalog_main.htm 文件。
    2. 找到显示栏目数量的代码行,通常在第 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>
    3. (<?=$myrow->arcnums?>) 这部分修改为调用一个自定义函数来获取总数,我们需要先在文件顶部定义这个函数。
    4. 在文件 <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;
      }
      ?>
    5. 将之前找到的 (<?=$myrow->arcnums?>) 修改为:
      (<?=GetTotalArc($myrow->id)?>)
    6. 保存文件并上传到服务器,刷新后台栏目管理页面,你就会看到每个栏目后面都显示了包含子栏目在内的总文章数。

使用 SQL 查询(后台或手动查询)

如果你只是想快速查看某个栏目的总文章数,可以直接在数据库里查询。

dede 栏目文章数量统计
(图片来源网络,侵删)
  • 查询某个栏目及其所有子栏目的文章总数
    -- 将 {栏目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 标签 + 自定义函数(推荐)

这个方法灵活且不修改核心文件,升级后也不会丢失。

  1. 在模板文件中定义函数: 在你想要显示文章数量的模板文件(index.htmlist_article.htm)的顶部,<head> 标签之后,添加 PHP 函数:

    dede 栏目文章数量统计
    (图片来源网络,侵删)
    <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>
  2. 在模板中调用函数: 使用 {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)是最佳选择,因为它既实现了功能,又保持了系统的安全性和可维护性。

-- 展开阅读全文 --
头像
织梦标签dede php如何实现动态数据调用?
« 上一篇 02-16
织梦二次开发手机网站如何适配多终端?
下一篇 » 02-17
取消
微信二维码
支付宝二维码

目录[+]