惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
博客园 - 司徒正美
D
Docker
T
The Blog of Author Tim Ferriss
罗磊的独立博客
博客园 - 叶小钗
酷 壳 – CoolShell
酷 壳 – CoolShell
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
J
Java Code Geeks
Jina AI
Jina AI
博客园 - 【当耐特】
C
Check Point Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog

Allen Hua 的网络博客

由于 Linux 桌面没有一个好用的天气程序就写了一个跨平台的CheckitoutWeather 给 caesium-image-compressor 图片压缩程序构建了 Linux AppImage v2.8.5 最新版 debian13(debian trixie)安装了nvidia闭源驱动后从x11切换到wayland的方法 山间摩旅追风,偶遇一场绚烂晚霞 最近使用debian系统的一些心得 机械革命无界14Pro笔记本debian forky成功驱动内置扬声器和麦克风 记录 typecho 1.2.0 升级到 1.3.0 过程 开发了一款openwrt插件:文本剪贴板 解决机械革命笔记本内屏高刷240Hz闪屏问题 使用 Java 写了一个局域网端口扫描器 - Allen Hua 的网络博客 openwrt使用外置根extroot机制扩展根分区大小 - Allen Hua 的网络博客 将机场ss节点批量转换成ss字符串链接批量添加到passwall - Allen Hua 的网络博客 给机械革命钛钽plus换屏:NY2换成NZ2 - Allen Hua 的网络博客 记录一次pve宿主机和上面的debian虚机无故down机事件 - Allen Hua 的网络博客 给图床部署cdn腾讯云的edgeone并排查Cache-Control max-age 3600的问题 - Allen Hua 的网络博客 从高山草甸到徽派古村:武功山反穿与皖浙赣自驾行记 - Allen Hua 的网络博客 增程器就是充电宝?别被忽悠了 - Allen Hua 的网络博客 浦口龙虎巷扫街,记录人间真实 博客图片压缩方案更新|AVIF|WebP|MozJPEG|标准JPEG Windows 电脑使用 Obs Studio 录制各个网站视频/桌面画面教程 为typecho博客添加latex支持 新能源汽车之纯电车使用交流慢充和直流快充的充电损耗对比 2025年3月更新全国5A景区名录 2025最新查看小米/红米手机电池健康度和循环次数方法 完美解决 seafile FILE_SERVER_ROOT 配置导致的内网外网不能同时访问和上传下载的问题 纯css实现typecho博客文章文字spoiler剧透效果 我对Typecho Facile主题的一些修改,图片懒加载优化,样式定制 2024年8月我的宜昌 - 重庆 - 川西小环线自驾旅行分享 2022年打卡南京市区人防工程纳凉点 2024年带着A7C2+腾龙28-200 再次来到红山森林动物园
Typecho 博客归档页面显示每年各发布了多少篇文章
Allen Hua · 2021-09-28 · via Allen Hua 的网络博客
阅读量:4841

warning: 这篇文章距离上次修改已过1639天,其中的内容可能已经有所变动。

上一篇文章提到了如何获取 Typecho 当前用户一共发布了多少篇公开的文章数,文章:Typecho 归档页面显示当前作者/用户的公开文章总数量

今天这篇文章要来获取这个用户每一年发布了多少文章。

搜了一下没有对应的解决方案,更没有 typecho 插件。那么就自己动手吧。应该一个函数就可以搞定的。

登录到后台数据库,发现下面的命令就可以。由于表 typecho_contentscreated 字段存储的是 unix time stamp(unix 时间戳),我们借助 mysql 原生函数 from_unixtime() 可以转换成普通的年月日-时分秒的形式。

统计 2021 年发布的文章数量

select count(distinct(cid)) from typecho_contents where from_unixtime(created, '%Y')='2021' and status='publish' and type='post';

返回 76

统计 2020 年发布的文章数量

select count(distinct(cid)) from typecho_contents where from_unixtime(created, '%Y')='2020' and status='publish' and type='post';

返回 50

统计 2019 年发布的文章数量

select count(distinct(cid)) from typecho_contents where from_unixtime(created, '%Y')='2019' and status='publish' and type='post';

返回 38

20210928220052.png

找到了每年发布的公开文章数

下面就是开始写 php 函数了。然而遇到了坑的地方,实际上是我不会 php。

在 typecho 封装的数据库操作工具中,where 子句里可以执行 mysql 原生函数吗,我试了始终不可以(如下代码),希望有知道怎么使用/应用的老哥教教我,在此文下评论一下,谢过了!

->where("from_unixtime('table.contents.created', '%Y') = ?" , $year));

遇到的报错是类似 Database Query Error,当时没有打开 debug 模式,不过后来想出来后文的解决方案。目前来看实现的还是不错的。

打开 typecho 的 debug 模式,会在异常/错误页面上显示具体问题以及 stack trace 详细信息

/** 开启调试模式,错误页面会显示具体的错误内容 */
define('__TYPECHO_DEBUG__', true);

上述 debug 代码加在博客根目录 config.inc.php 文件中。


下面介绍的两段代码就是最终解决方案。

1. functions.php

在博客主题的 functions.php 中添加如下函数

/**
 * 分别获取哪一年发表了多少篇公开文章
 */
function getYearNum($id, $year)
{
    $db = Typecho_Db::get();
    date_default_timezone_set('Asia/Shanghai');

    $array = $db->fetchAll($db->select('created')
        ->from('table.contents')
        ->where('table.contents.authorId = ?', $id)
        ->where('table.contents.status = ?', 'publish')
        ->where('table.contents.type = ?', 'post'));

    $tempArr = array();
    foreach ($array as $item) {
        $date = date("Y", (int)($item['created']));
        array_push($tempArr, $date);
    }
    $resultArr = array_filter($tempArr, function ($ele) use ($year) {
        return $ele == $year;
    });
    return sizeof($resultArr);
}

array_filter($tempArr, function ($ele) use ($year) { 这里 use($year) 的用法是在一个群里请教了大佬的,感谢大佬的相助!真是啊。

PHP闭包 function() use()中的详细使用方法

2. page-archives.php

在博客主题对应的 page-archives.php 文件中找到如下代码(可能不完全相同,需要自己确定放置的位置)

if ($year != $year_tmp) {

然后在下面适当位置添加如下代码

$yearNum = getYearNum($this->author->uid, $year);
$output .= '<h4>' . date('Y 年', $archives->created) . '一共发布了 ' . $yearNum . ' 篇文章</h4>';

最终会在每一年的 H3 标题下生成 2020 年一共发布了 50 篇文章 这样的 H4 标题。

最终预览一下我的 归档页面 ,下面是几张截图

20210928221706.png
20210928221719.png
20210928221736.png

如果有帮到你的话,欢迎一键三连!