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