前言
原因分析:在后台设置了阅读量后,前台不显示。
查找原因
经过查找,找到了下面代码
<span><?php if(isset($this->fields->viewsNum)){ _e('<i class="iconfont icon-eye"></i> 浏览量 '); $this->fields->viewsNum(); } ?></span>
看来是调用了typecho的自定义字段功能,自定义字段为viewsNum
。
分析typecho的自定义字段功能
调用字段
$field = $this->fields->fieldName;
输出字段
$this->fields->fieldName();
判断字段
if(isset($this->fields->fieldName)){
echo '字段存在,值为:'.$this->fields->fieldName;
}else{
echo '字段不存在';
}
经过判断发现字段viewsNum
不存在。
接着进行分析:
在functions
文件末尾,发现以下语句。
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);
}
}
发现需要在数据库中获取views
的值,但是在数据库中找不到相应的views
表。看起来需要对数据库入手。
零时解决办法
将上段语句替换为下面语句
//get_post_view($this)
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'];
}
在index.php
和post.php
中将
<span><?php if(isset($this->fields->viewsNum)){ _e('<i class="iconfont icon-eye"></i> 浏览量 '); $this->fields->viewsNum(); } ?></span>
替换为:
<span><i class="iconfont icon-eye"></i> 浏览量 <?php Views_Plugin::theViews(); ?> </span>
One comment
前排围观!