迁移主题后一边微调样式一边添加缺失功能,这篇记录一下给 Typecho 博客添加文章字数统计和预计阅读时间的功能。

Screenshot 02-10 at 15.56.34@2x

把下文代码添加到 functions.php 中,文件一般在 /usr/themes/主题文件夹 目录。

文章字数统计

/**
 * 文章字数统计
 */
function  art_count($cid)
{
    $db = Typecho_Db::get();
    $rs = $db->fetchRow($db->select('table.contents.text')->from('table.contents')->where('table.contents.cid=?', $cid)->order('table.contents.cid', Typecho_Db::SORT_ASC)->limit(1));
    $text = preg_replace("/[^\x{4e00}-\x{9fa5}]/u", "", $rs['text']);
    echo mb_strlen($text, 'UTF-8');
}

函数 art_count 用于统计文章中的中文字符,接收文章 ID 参数 $cid

  1. Typecho_Db::get() 获取数据库连接实例 $db
  2. $db->select() 构建 SQL 查询,从 table.contents 表中选择 text 字段,并根据 cid 匹配特定文章的数据
  3. fetchRow() 执行查询,并按 cid 升序排序,限制结果为一条记录
  4. preg_replace()$rs['text'] 中非中文字符替换为空,仅保留中文字符。正则表达式 "[^\x{4e00}-\x{9fa5}]" 用于匹配非中文字符
  5. mb_strlen() 计算过滤后的文本长度,指定编码为 'UTF-8'
  6. echo 输出中文字符的数量

预计阅读时间

/**
 * 文章阅读时间统计
 */
function art_time($cid)
{
    $db = Typecho_Db::get();
    $rs = $db->fetchRow($db->select('table.contents.text')->from('table.contents')->where('table.contents.cid=?', $cid)->order('table.contents.cid', Typecho_Db::SORT_ASC)->limit(1));
    $text = preg_replace("/[^\x{4e00}-\x{9fa5}]/u", "", $rs['text']);
    $text_word = mb_strlen($text, 'utf-8');
    return ceil($text_word / 300);
}

函数 art_time 计算文章阅读时间,接收文章 ID 参数 $cid

  1. 将中文字符数除以 300 (假设每分钟阅读 300 个汉字),并用 ceil 函数向上取整,计算出阅读时间 (分钟)
  2. 根据网络信息一般人的中文字符阅读速度在 200-400 字符,这里取中间 300,也可自行调整
  3. 最终返回估计的阅读时间,以分钟为单位

添加到页面

添加后找到要展示的位置,如文章页面标题底下的 Metadata 栏,位置在主题中文件夹中的 post.php 文件:

<ul class="post-meta">
    <li><?php _e('时间: '); ?>
        <time datetime="<?php $this->date('c'); ?>" itemprop="datePublished"><?php $this->date(); ?></time>
    </li>

    <!-- 全文字数 -->
    <li>
        <span>约 <?php art_count($this->cid); ?> 字</span>
    </li>

    <!-- 阅读时间 -->
    <li>
        <span>
            <?php
            $minutes = art_time($this->cid);
            echo $minutes . ' ' . ($minutes == 1 ? 'min' : 'mins') . ' read';
            ?>
        </span>
    </li>

    <li><?php _e('分类: '); ?><?php $this->category(','); ?></li>
</ul>

阅读时间统计根据英语单复数语法有调整,当 $minutes 等于 1 时使用 min,大于 1 时使用 mins

其他文案和样式就自行修改,保存刷新后就能显示了。

参考链接:

  1. 给Typecho主题加上预计阅读时间和文章字数统计代码

标题:为 Typecho 博客添加文章字数统计和预计阅读时间

日期:2025-02-10

链接:https://logs.do/logs/add-word-count-and-reading-time-to-a-typecho-blog.html

许可:© CC BY 4.0 · 转载请保留原文链接及作者

标签: typecho

添加新评论

仅有一条评论

  1. 厉害了