Typecho 免插件统计浏览次数,输出热门文章

Ryan

2020-05-05/11 评论/511 浏览

前提

好几年前我在打造SimpX主题的时候撸了下面的浏览次数统计代码。

/*
 * 获取浏览次数(改进版)
 */
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);
}

需求

这次在整poRebuild主题的时候发现原来的调用方式不太合适我这次的输出需求,改造成在themeInit函数里自动增加浏览次数,无论页面是否展示都能自动统计。当然了,还是利用自定义字段,不动数据库结构。

同时我新弄的主题还需要热门文章输出的功能,一并把代码撸了。

代码

浏览次数查询

先给出查询浏览次数的代码,为了方便拓展(比如输出点赞次数),自定义字段都是可变参数,同时支持控制直接输出或者返回。

function views($widget, $format0 = "%d", $format1 = "%d", $formats = "%d", $return = false, $field = 'views')
{
    $fields = unserialize($widget->fields);
    if (array_key_exists($field, $fields)) {
        $fieldValue = (!empty($fields[$field])) ? intval($fields[$field]) : 0;
    } else {
        $fieldValue = 0;
    }
    if ($fieldValue == 0) {
        $fieldValue = sprintf($format0, $fieldValue);
    } else if ($fieldValue == 1) {
        $fieldValue = sprintf($format1, $fieldValue);
    } else {
        $fieldValue = sprintf($formats, $fieldValue);
    }
    if ($return) {
        return $fieldValue;
    } else {
        echo $fieldValue;
    }
}

在展示的地方调用

<?php views($this); ?>

浏览次数统计

/**
 * 增加浏览次数
 * 使用方法: 在<code>themeInit</code>函数中添加代码
 * <pre>if($archive->is('single') || $archive->is('page')){ viewsCounter($archive);}</pre>
 *
 * @param Widget_Archive $widget
 * @return boolean
 */
function viewsCounter($widget, $field = 'views')
{
    if (!$widget instanceof Widget_Archive) {
        return false;
    }

    $fieldValue = views($widget, "%d", "%d", "%d", true, $field);
    $fieldRecords = Typecho_Cookie::get('__typecho_' . $field);
    if (empty($fieldRecords)) {
        $fieldRecords = array();
    } else {
        $fieldRecords = explode(',', $fieldRecords);
    }

    if (!in_array($widget->cid, $fieldRecords)) {
        $fieldValue = $fieldValue + 1;
        $widget->setField($field, 'str', strval($fieldValue), $widget->cid);
        $fieldRecords[] = $widget->cid;
        $fieldRecords = implode(',', $fieldRecords);
        Typecho_Cookie::set('__typecho_' . $field, $fieldRecords);
        return true;
    }
    return false;
}

调用方式,需要在主题themeInit函数中调用

funciton themeInit() {
    if($archive->is('single') || $archive->is('page')){ viewsCounter($archive);}
}

输出热门文章

此处内容已隐藏,回复后(需要填写邮箱)可见

直接调用和主题调用文章列表是一样的

<?php $widget = hotspots(); ?>
<?php while($widget->next()): ?>
    <?php $widget->title(); ?>
<?php endwhile;?>

最后

当然,别忘了你的主题或者插件新增了 views 字段,删掉

ALTER TABLE `typecho_contents` DROP `views`;
文章出自:虾米皮皮乐 https://xiamp.net/archives/typecho-views-hotspots.html,版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。
11 条评论
511 浏览
您的大名:
万水千山总是情,给个打赏行不行。 打赏

发表评论

;-) :| :smile: :sad: :razz: :oops: :sup: :lol: :grin: :cry: :cool: :???:

已有 11 条评论

  1. 木灵鱼儿 路过 Windows 10 x64 Edition / Firefox 77.0 2020-06-26 16:40

    :cry:表情太少了

  2. HelloWorld 路过 Windows 10 x64 Edition / Google Chrome 83.0.4103.116 2020-07-05 11:43

    表情太少了:oops:

  3. 木灵鱼儿 路过 Windows 10 x64 Edition / Firefox 79.0 2020-08-10 18:25

    再来看看啊啊啊

  4. 木灵鱼儿 路过 Windows 10 x64 Edition / Firefox 79.0 2020-08-10 21:49

    做个笔记,统计函数里面的Stat::这个关键字需要删除,有两处,一处在函数本身内,一处在调用的那段代码里,然后获取热门文章,hotspots();这个函数支持两个参数,第一个是需要输出的文章数量,第二个不清楚,然后在while循环里面,博主漏写了变量符号,使用会报错,所有数据都要基于$widget这个变量,比如标题:$widget->title(); 链接:$widget->permalink()

    1. Ryan 管理 Windows 10 x64 Edition / Firefox 79.0 2020-08-11 06:57

      第二个参数是操作字段名,比如我想用 llcs 这个字段来存储浏览次数,调用形式就类似viewsCounter($archive, 'llcs'),views($this, 'llcs')

  5. 木灵鱼儿 路过 Windows 10 x64 Edition / Firefox 80.0 2020-09-07 23:17

    <<<<<<来看看>>>>>>

  6. 木灵鱼儿 路过 Windows 10 x64 Edition / Firefox 80.0 2020-09-07 23:18

    看不了啊,我敲

  7. 木灵鱼儿 路过 Windows 10 x64 Edition / Firefox 80.0 2020-09-07 23:26

    不知道你对回复可见做了什么

  8. love2wind 路过 Windows 10 x64 Edition / Google Chrome 87.0.4255.0 2020-09-16 12:08

    怎么控制标题字数

    1. Ryan 管理 Windows 10 x64 Edition / Firefox 79.0 2020-09-16 16:04
      <?php Typecho_Common::subStr(strip_tags($archive->title), 0, 10, '...'); ?>

      0是起始位置,10是长度

  9. love2wind 路过 Windows 7 x64 Edition / Google Chrome 86.0.4240.30 2020-09-17 00:09

    就是这个主题的热门文章调用里的标题怎么控制?
    $post_title = htmlspecialchars($result['title']);
    是这里吗?

虾米皮皮乐

Ryan

版权申明:收费资源由本站发布,用户购买后只有终端使用权,禁止转售和转载

Typecho 免插件统计浏览次数,输出热门文章
05/05
2020
前提好几年前我在打造SimpX主题的时候撸了下面的浏览次数统计代码。/* * 获取浏览次数(...
扫描右侧二维码阅读全文