Typecho 代码实现文章阅读次数统计(含cookie版)

分享typecho阅读次数统计代码,并对此进行优化加入了cookie验证,重复刷新页面也只会增加一次阅读次数。

将下面这段代码加到functions.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')) {
$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验证,将文章的第一段代码用下面的代码替换即可:

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