最近弄个自己的个人博客,最终选择了Typecho程序,就像官方宣传的那样:轻量高效、先进稳定、简洁友好
随便把默认模版修改了一下,就可以上线了
实际的使用过程中,发现Typecho连基本的浏览统计都没有,扩展功能都是使用插件来实现的。原本是想随便下载一个拿来用就好,为了熟悉Typecho,还是看了下文档,鼓捣出了一个插件:

  1. 插件会在contents表中新增字段:viewsNum

  2. 浏览数据保存在cookie中,在不清除cookie或者cookie未过期的情况下不会重复计数

激活插件方法

/**
 * 激活插件方法,如果激活失败,直接抛出异常
 * 
 * @access public
 * @return void
 * @throws Typecho_Plugin_Exception
 */
public static function activate()
{
    $db = Typecho_Db::get();
    $prefix = $db->getPrefix();
    // contents 表中若无 viewsNum 字段则添加
    if (!array_key_exists('viewsNum', $db->fetchRow($db->select()->from('table.contents'))))
        $db->query('ALTER TABLE `'. $prefix .'contents` ADD `viewsNum` INT(10) DEFAULT 0;');
    //增加浏览数
    Typecho_Plugin::factory('Widget_Archive')->beforeRender = array('TePostViews_Plugin', 'viewCounter');
    //把新增的字段添加到查询中
    //Typecho_Plugin::factory('Widget_Archive')->query = array('TePostViews_Plugin', 'addQueryField'); 使用该接口会出现Bug,已修改为
    Typecho_Plugin::factory('Widget_Archive')->select = array('TePostViews_Plugin', 'selectHandle');
}

增加统计数据

/**
 * 增加浏览量
 * @params Widget_Archive   $archive
 * @return void
 */
public static function viewCounter($archive){
    if($archive->is('single')){
        $cid = $archive->cid;
        $views = Typecho_Cookie::get('extend_contents_views');
        if(empty($views)){
            $views = array();
        }else{
            $views = explode(',', $views);
        }
        if(!in_array($cid,$views)){
            $db = Typecho_Db::get();
            $row = $db->fetchRow($db->select('viewsNum')->from('table.contents')->where('cid = ?', $cid));
            $db->query($db->update('table.contents')->rows(array('viewsNum' => (int)$row['viewsNum']+1))->where('cid = ?', $cid));
            array_push($views, $cid);
            $views = implode(',', $views);
            Typecho_Cookie::set('extend_contents_views', $views); //记录查看cookie
        }
    }
}

最后把增加的字段添加到查询中,以便在模版中直接调用

//cleanAttribute('fields')清除查询字段,select * 
public static function selectHandle($archive){
    $user = Typecho_Widget::widget('Widget_User');
    if ('post' == $archive->parameter->type || 'page' == $archive->parameter->type) {
        if ($user->hasLogin()) {
            $select = $archive->select()->where('table.contents.status = ? OR table.contents.status = ? OR
                    (table.contents.status = ? AND table.contents.authorId = ?)',
                    'publish', 'hidden', 'private', $user->uid);
        } else {
            $select = $archive->select()->where('table.contents.status = ? OR table.contents.status = ?',
                    'publish', 'hidden');
        }
    } else {
        if ($user->hasLogin()) {
            $select = $archive->select()->where('table.contents.status = ? OR
                    (table.contents.status = ? AND table.contents.authorId = ?)', 'publish', 'private', $user->uid);
        } else {
            $select = $archive->select()->where('table.contents.status = ?', 'publish');
        }
    }
    $select->where('table.contents.created < ?', Typecho_Date::gmtTime());
    $select->cleanAttribute('fields');//主要是这个方法:清除Typecho contents表默认字段,改为`*`
    return $select;
}

使用

<?php _e('阅读:'); ?>(<?php $this->viewsNum(); ?>)

下载地址:TePostViews.rar