TYPECHO WIKI
每一个作品都值得被记录

敬告读者,感谢您对本站的支持,在今年10月份因Racknerd机房硬盘事故,导致本站静态文件全部丢失,包含主题插件网站图片等文件,TypechoWiki经过几次更换站长,凝结了多位站长的心血,如今因为大意只备份了数据库未及时备份静态文件而导致严重数据丢失事故,现已无力回天,经过深思我决定后续可能永久停更该网站,请各位读者寻求其它Typecho周边下载站,另外如果你对本站感兴趣也欢迎报价,我们愿意出售该站联系邮箱[email protected],目前该站的静态文件仅为2019年以前的版本,2019年以后的各位站长精心维护的插件和主题压缩包以及站内图片全部丢失!

Typecho 主题开发之获取网站统计数据

Typecho维基君Typecho教程 • 1108次浏览 • 发布 2023-01-17 • 更新 2023-01-17

在我的博客中有一个 博客统计 页面,这个页面可以显示网站的一些基本数据,我开发的 Typecho 主题中也包含统计页模板,这里就来简单写一下获取各种统计信息的方法。

这里主要是网站的统计信息,不包含浏览用户的统计信息,如果需要浏览用户的统计信息可以使用百度统计或谷歌分析。

Typecho 官方是没有提供获取统计数据的 API 的,只能手动查询数据库获取统计信息,Typecho 也提供了一些操作数据库的方法。

下面的代码都是编写成函数,放在主题的 functions.php 文件中,在每个页面都能调用。

获取文章数量

下面是获取文章总数量的函数,不包含独立页面:

function postCount() {
    $db = Typecho_Db::get();
    // 查询出文章数量并转换为数组
    $count = $db->fetchRow($db->select('COUNT(*)')->from('table.contents')->where('type = ?', 'post')->where('status = ?', 'publish'));
    // 返回文章数量
    return $count['COUNT(*)'];
}

上面的函数可以获取文章数量,不包含草稿和未公开的文章。

Typecho 的文章和独立页面都存储在 Typecho 数据库的 typecho_contents 表中,使用 Typecho 提供的 API 查询时可以不需要加 typecho 前缀。

typecho_contents 表中有个 type 字段是用来存储内容类型的,post 是普通文章,page 是独立页面。status 字段是存储文章状态,publish 是公开的,draft 是草稿。

如果要获取独立页面数量可以把 where('type = ?', 'post') 换为 where('type = ?', 'page') ,如果要获取所有公开、未公开、和草稿文章数量可以直接把 where('status = ?', 'publish') 方法删除。

获取评论数量

下面是获取评论总数量的函数,只包含通过审核的评论:

function commentsCount() {
    $db = Typecho_Db::get();
    // 查询出评论数量并转换为数组
    $count = $db->fetchRow($db->select('COUNT(*)')->from('table.comments')->where('status = ?', 'approved'));
    // 返回评论数量
    return $count['COUNT(*)'];
}

Typecho 的评论存储在 typecho_comments 表中,status 字段存储评论的状态,approved 是通过审核的评论,waiting 是待审核的评论,spam 是标记为垃圾的评论。

如果要获取所有评论,不区分状态的话可以把 where('status = ?', 'approved') 方法删除。

获取分类数量

下面是获取分类数量的函数:

function categoryCount() {
    $db = Typecho_Db::get();
    // 查询出分类数量并转换为数组
    $count = $db->fetchRow($db->select('COUNT(*)')->from('table.metas')->where('type = ?', 'category'));
    // 返回分类数量
    return $count['COUNT(*)'];
}

Typecho 的分类和标签都存储在 typecho_metas 表中,这个表中有一个 type 字段用来区分标签和分类,tag 是标签,category 是分类。

获取标签数量

下面是获取标签数量的函数

function tagCount() {
    $db = Typecho_Db::get();
    $count = $db->fetchRow($db->select('COUNT(*)')->from('table.metas')->where('type = ?', 'tag'));
    return $count['COUNT(*)'];
}

Typecho 的分类和标签都存储在一个表中,只需要把 where('type = ?', 'category') 换为 where('type = ?', 'tag') 就可以查询出标签数量。

获取总点赞数量

Typecho 是不包含点赞功能的,如果你按照 Typecho 主题开发 - 点赞功能 这篇文章开发了点赞功能,在文章表中加入了 agree 字段的话,可以使用下面的函数获取点赞总数:

function agreeCount() {
    $db = Typecho_Db::get();
    // 对文章表的 agree 字段进行求和并把查询出的结果转换为数组
    $count = $db->fetchRow($db->select('SUM(agree) AS agreeCount')->from('table.contents'));
    // 返回总点赞数
    return $count['agreeCount'];
}

获取评论数量排名前 5 的 5 篇文章

下面是获取评论数排名前 5 的 5 篇文章的函数,除了文章外也会获取评论数:

function top5CommentPost() {
    $db = Typecho_Db::get();
    // 查询出 5 条评论数最大的文章,按照评论数从大到小排序,然后把查询出的数据转换为数组
    $top5Post = $db->fetchAll($db->select()->from('table.contents')->where('type = ?', 'post')->where('status = ?', 'publish')->order('commentsNum', Typecho_Db::SORT_DESC)->offset(0)->limit(5));
    // 用来存储文章信息的数组
    $postList = array();
    foreach ($top5Post as $post) {
        // 使用 Typecho 提供的 API 获取每篇文章的链接地址
        $post = Typecho_Widget::widget('Widget_Abstract_Contents')->filter($post);
        // 把文章标题、链接、点赞数加入数组
        array_push($postList, array(
            'title' => $post['title'],
            'link' => $post['permalink'],
            'commentsNum' => $post['commentsNum']
        ));
    }
    // 返回 5 篇文章的标题、链接、点赞数
    return $postList;
}

typecho_contents 文章表中有一个 commentsNum 字段就是用来存储评论数量的。

上面的 top5CommentPost 函数返回的数据如下:

Array
(
    [0] => Array
        (
            [title] => MWordStar 响应式双栏 Typecho 博客主题
            [link] => http://localhost/php/typecho/index.php/archives/812/
            [commentsNum] => 159
        )

    [1] => Array
        (
            [title] => MWordStar 使用说明
            [link] => http://localhost/php/typecho/index.php/archives/819/
            [commentsNum] => 127
        )

    [2] => Array
        (
            [title] => 红米 AC2100 刷入 Padavan 固件
            [link] => http://localhost/php/typecho/index.php/archives/883/
            [commentsNum] => 38
        )

    [3] => Array
        (
            [title] => Facile 一个简洁的 Typecho 博客主题
            [link] => http://localhost/php/typecho/index.php/archives/899/
            [commentsNum] => 27
        )

    [4] => Array
        (
            [title] => Linux 搭建 Minecraft 基岩版服务器
            [link] => http://localhost/php/typecho/index.php/archives/865/
            [commentsNum] => 26
        )

)

获取各分类的文章数量

下面是获取分类文章数量的函数,可以用来生成统计图表:

function categoryPostCount() {
    $db = Typecho_Db::get();
    // 查询出每个分类的文章数量并转换为数组
    $count = $db->fetchAll($db->select('name', 'count')->from('table.metas')->where('type = ?', 'category'));
    // 如果没有查询到数据就返回空数组
    if (count($count) < 1) {
        return array();
    }
    // 返回每个分类的文章数量
    return $count;
}

分类文章数量也是存储在 typecho_metas 表中,count 字段就是分类或标签的文章数量。

下面是获取的数据:

Array
(
    [0] => Array
        (
            [name] => PHP
            [count] => 14
        )

    [1] => Array
        (
            [name] => 前端开发
            [count] => 69
        )

    [2] => Array
        (
            [name] => 数据库
            [count] => 6
        )

    [3] => Array
        (
            [name] => Linux相关
            [count] => 23
        )

    [4] => Array
        (
            [name] => 实用教程
            [count] => 28
        )

)

在我的博客中还有阅读量和图表展示,但是 Typecho 是不包含统计阅读量的功能的,我也还没有写过开发阅读统计的文章,我的方法也不一定适用于其他网站的教程,所以这里不包含阅读量统计的函数。

图表展示的话,不同的图表对数据格式的要求也不一样,我使用的是百度的 ECharts,完整的 ECharts 比较大,只能按需引入打包,内容很多,写在这里不方便阅读,后面可能会考虑再写一篇。

另外除了该篇博文作者所提到的以上方法以外,还可以用Typecho自带的统计函数调用如下

<?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?>
文章总数:<?php $stat->publishedPostsNum() ?>篇
分类总数:<?php $stat->categoriesNum() ?>个
评论总数:<?php $stat->publishedCommentsNum() ?>条
页面总数:<?php $stat->publishedPagesNum() ?>页
广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,Typecho.Wiki所有文章均包含本声明。
厂商投放

【腾讯云】🎉五一云上盛惠!云服务器99元/月续费同价!

腾讯云五一劳动节海量产品 · 轻松上云!云服务器首年1.8折起,买1年送3个月!超值优惠,性能稳定,让您的云端之旅更加畅享。快来腾讯云选购吧!

广告
添加新评论 »

仅有一条评论 »

  1. 阿汤 阿汤

    感谢分享