最近在打造新主题,想给主题增加统计功能,为了不使用Views插件,撸了下面的代码,使用自定义字段保存数据,不会改动数据库结构

  • /*
  • * 获取浏览次数
  • */
  • function getViewsStr($widget, $format = "{views} 次浏览") {
  • $fields = unserialize($widget->fields);
  • if (array_key_exists('views',$fields))
  • $views = (!empty($fields['views'])) ? intval($fields['views']) : 0;
  • else
  • $views = 0;
  • //增加浏览次数
  • if ($widget->is('single')) {
  • $views = $views + 1;
  • $widget->setField('views', 'str', strval($views), $widget->cid);
  • }
  • return str_replace("{views}", $views, $format);
  • }
复制

把以上代码放到functions.php最后,然后就可以在各个页面通过

  • <?php _e(getViewsStr($this)); /* $this 是 Widget_Archive 对象 */ ?>
复制

输出统计次数。
应用到主题后发现不太好,每刷新一次都会重复统计浏览次数,数字大了没什么用。
所以我就通过Cookies“记住”浏览过的文章,下次再访问就部统计了,以下的代码也是放到functions.php最后

  • /*
  • * 获取浏览次数(改进版)
  • */
  • function getViewsStr($widget, $format = "{views} 次浏览") {
  • $fields = unserialize($widget->fields);
  • if (array_key_exists('views', $fields))
  • $views = (!empty($fields['views'])) ? intval($fields['views']) : 0;
  • else
  • $views = 0;
  • //增加浏览次数
  • if ($widget->is('single')) {
  • $vieweds = Typecho_Cookie::get('contents_viewed');
  • if (empty($vieweds))
  • $vieweds = array();
  • else
  • $vieweds = explode(',', $vieweds);
  • if (!in_array($widget->cid, $vieweds)) {
  • $views = $views + 1;
  • $widget->setField('views', 'str', strval($views), $widget->cid);
  • $vieweds[] = $widget->cid;
  • $vieweds = implode(',', $vieweds);
  • Typecho_Cookie::set("contents_viewed",$vieweds);
  • }
  • }
  • return str_replace("{views}", $views, $format);
  • }
复制

好了,完美。又省下一个插件了。