Typecho 不用插件实现文章阅读次数统计

Typecho 是国人开发的一款轻量的 Blog 系统,非常的受技术党的欢迎,我自己也用 Typecho 搭建了一个自认为不错的基于 Typecho 的 Blog。
在 Typecho 中,很多功能可以用过插件实现,不过有些功能依赖插件总会导致 Blog 逐渐臃肿,所以简单的改改代码是不错的选择,比如实现文章阅读次数统计的功能。

方案说明

目前代码有两种类型,分为不包含 cookie 验证和包含 cookie 验证的两段。

一般修改这种代码,我们选择修改 Typecho 的主题文件中的function.php文件,而实现这一功能,我们需要在function.php文件中加入下面这段代码:

//get_post_view($this)
function get_post_view($archive)
{
$cid = $archive->cid;
$db = Typecho_Db::get();
$prefix = $db->getPrefix();
if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
$db->query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT(10) DEFAULT 0;');
echo 0;
return;
}
$row = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid));
if ($archive->is('single')) {
$db->query($db->update('table.contents')->rows(array('views' => (int) $row['views'] + 1))->where('cid = ?', $cid));
}
echo $row['views'];
}

加入上述的代码文件之后,我们再在想要显示浏览次数的位置加入下面这段代码即可:

<?php get_post_view($this) ?>

上面的统计代码只是机械的统计点击次数,如果一个人反复点击多次都会被算上,队友有些要求比较高的博主体验不会很好,所以下面给一段加了 cookie 验证的代码,同样是放在function.php文件就可以了:

function get_post_view($archive)
{
$cid = $archive->cid;
$db = Typecho_Db::get();
$prefix = $db->getPrefix();
if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
$db->query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT(10) DEFAULT 0;');
echo 0;
return;
}
$row = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid));
if ($archive->is('single')) {
$views = Typecho_Cookie::get('extend_contents_views');
if(empty($views)){
$views = array();
}else{
$views = explode(',', $views);
}
if(!in_array($cid,$views)){
$db->query($db->update('table.contents')->rows(array('views' => (int) $row['views'] + 1))->where('cid = ?', $cid));
array_push($views, $cid);
$views = implode(',', $views);
Typecho_Cookie::set('extend_contents_views', $views); //记录查看cookie
}
}
echo $row['views'];
}

展示同样只用把下面的代码放在你想要在 Blog 展示的位置即可:

<?php get_post_view($this) ?>

注:
本文代码来自Typecho 爱好者博客,本博客重新整理排版发布。