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