今天心血来潮突然想给文章加上阅读量,功能和样式都费劲设置好后,又觉得有点多余。本身我的博客就是极简风格,这个功能也并非必要。写博客初心就是当笔记本用,为自己而写,也不在乎阅读量。所以又删除了。以下把过程做个记录,留着备用吧。

显示文章阅读量(浏览人数)

通过cookie判断,每个用户对同一篇文章只增加一次阅读计数。

1.在functions.php文件添加如下代码

function Postviews($archive) {
    // 获取数据库实例
    $db = Typecho_Db::get();
    
    // 从归档对象中获取当前文章的cid(内容ID)
    $cid = $archive->cid;

    // 检查数据库表'table.contents'中是否存在'views'列
    if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
        // 如果不存在,则添加一个名为'views'的列,默认值为0
        $db->query('ALTER TABLE `'.$db->getPrefix().'contents` ADD `views` INT(10) DEFAULT 0;');
    }

    // 查询当前文章的阅读量
    $exist = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid))['views'];

    // 如果当前页面是单篇文章页面
    if ($archive->is('single')) {
        // 获取存储在cookie中的已查看文章ID列表
        $cookie = Typecho_Cookie::get('contents_views');
        // 如果cookie存在,则将其分割成数组;否则初始化为空数组
        $cookie = $cookie ? explode(',', $cookie) : array();

        // 如果当前文章的CID不在cookie数组中,表示该用户还未阅读过这篇文章
        if (!in_array($cid, $cookie)) {
            // 更新数据库,将该文章的阅读量加1
            $db->query($db->update('table.contents')
                ->rows(array('views' => (int)$exist+1))
                ->where('cid = ?', $cid));
            // 将新的阅读量赋值给$exist变量
            $exist = (int)$exist+1;
            // 将当前文章的CID添加到已读文章的cookie数组中
            array_push($cookie, $cid);
            // 将更新后的已读文章CID列表转换为字符串形式
            $cookie = implode(',', $cookie);
            // 设置cookie,保存用户已阅读的文章列表
            Typecho_Cookie::set('contents_views', $cookie);
        }
    }

    // 输出阅读量,如果阅读量为0则显示“暂无阅读”,否则显示具体的阅读数量
    echo $exist == 0 ? '   暂无阅读' :'   阅读量: '.$exist;
}

2.把代码<?php Postviews($this); ?>添加到想要显示的位置即可显示了,比如文章页post.php里。

显示文章阅读量(浏览次数)

每次点击文章,都会增加1个阅读量,好像博客里大部分都是这种方式,可能这样看着阅读量好看吧。

1.在functions.php文件添加如下代码

function Postviews($archive) {
    // 获取数据库实例
    $db = Typecho_Db::get();
    
    // 从归档对象中获取当前文章的cid(内容ID)
    $cid = $archive->cid;

    // 检查数据库表'table.contents'中是否存在'views'列
    if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
        // 如果不存在,则添加一个名为'views'的列,默认值为0
        $db->query('ALTER TABLE `'.$db->getPrefix().'contents` ADD `views` INT(10) DEFAULT 0;');
    }

    // 查询当前文章的阅读量
    $exist = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid))['views'];

    // 如果当前页面是单篇文章页面
    if ($archive->is('single')) {
        // 更新数据库,将该文章的阅读量加1
        $db->query($db->update('table.contents')
            ->rows(array('views' => (int)$exist + 1))
            ->where('cid = ?', $cid));
        
        // 更新$exist变量以反映新的阅读量
        $exist = (int)$exist + 1;
    }

    // 输出阅读量,如果阅读量为0则显示“暂无阅读”,否则显示具体的阅读数量
    echo $exist == 0 ? '   暂无阅读' : '   阅读量: '.$exist;
}

2.和上面一样,把代码<?php Postviews($this); ?>添加到想要显示的位置即可显示了,比如文章页post.php里。