不使用插件实现文章浏览数统计

绛木子 30.5k 8

在Typecho主题的functions.php 文件中,提供了三个系统方法:

  • themeConfig 用于配置主题
  • themeInit 在初始化皮肤函数时调用
  • themeFields 后台编辑文章时,为主题增加一个自动绑定的输入框(最新开发版添加此方法)

为了实现文章浏览数统计功能,这里用到了themeInitthemeFields,具体见下面的代码

// 添加浏览数字段到内容
function themeFields($layout) {
    $viewsNum = new Typecho_Widget_Helper_Form_Element_Text('viewsNum', NULL, 0, _t('文章浏览数'), _t('文章浏览数统计'));
    $layout->addItem($viewsNum);
}

/*
 * @params Widget_Archive $archive
 */
function themeInit($archive){
    // 判断是否为文章或页面
    if($archive->is('single')){
        viewCounter($archive);
    }
}

/*
 * 统计文章浏览数
 * @params Widget_Archive $archive
 */
function viewCounter($archive){
    $cid = $archive->cid;
    $views = Typecho_Cookie::get('__typecho_views');
    $views = !empty($views) ? explode(',', $views) : array();
    if(!in_array($cid,$views)){
        $db = Typecho_Db::get();
        $field = $db->fetchRow($db->select()->from('table.fields')->where('cid = ? AND name = ?', $cid , 'viewsNum'));
        if(empty($field)){
            $db->query($db->insert('table.fields')
            ->rows(array('cid' => $cid, 'name' => 'viewsNum', 'type' => 'str', 'str_value' => 1, 'int_value' => 0, 'float_value' => 0)));
        }else{
            $db->query($db->update('table.fields')->expression('str_value', 'str_value + 1')->where('cid = ? AND name = ?', $cid , 'viewsNum'));
        }
        array_push($views, $cid);
        $views = implode(',', $views);
        Typecho_Cookie::set('__typecho_views', $views); //记录到cookie
    }
}

显示浏览数则可直接在模板中使用

<?php if(isset($this->fields->viewsNum)){ $this->fields->viewsNum(); } ?>

则可进行输出显示

本站只作功能演示之用。严禁发布低俗、违法、涉及政治的内容。