wordpress 无插件实现统计文章总点击和每天的点击

作者

wordpress默认没有统计文章点击次数的功能,有很多这样的插件可以完成。但是wordpress足够灵活,对于不喜欢用插件的同学,手动制作一个统计文章点击次数的功能,也是很方便的。这里总结一下,制作的过程。

先看一下效果图

wordpress无插件统计点击次数
wordpress无插件统计点击次数

首先明白工作原理。先看下 wordpress的 wp_postmeta 表。
worpdress wp_postmeta表

+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| meta_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| post_id    | bigint(20) unsigned | NO   | MUL | 0       |                |
| meta_key   | varchar(255)        | YES  | MUL | NULL    |                |
| meta_value | longtext            | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+

文章元数据表wp_postmeta可以用来存放扩展wp_post表没有的信息。所以可以在这个表里添加meta_keypost-clicksmeta_value为点击次数的数据。 meta_value 默认是0,每次访问这篇文章的时候,自动增加1这样就可以进行统计了。当然post_id是用记录文章的ID的。

首先看下默认情况 是没有存放数据的

select * from wp_postmeta where  meta_key='post-clicks';
Empty set (0.00 sec)

如何存放数据

在wordpress模板文件中, functions.php 加入以下代码

add_action("wp_head", function () {
    if(is_singular()) {
        global $post;
        // 如果不存在会返回0
        $views = (int) get_post_meta($post->ID, 'post-clicks', TRUE);
        // 如果不存 meat字段(post-clicks)  会自动添加
        update_post_meta($post->ID, 'post-clicks', $views+1);
    }
});

这样简单的几行代码,就可以实现统计文章的点击次数的功能。如果想更精确一点,可以添加两个判断,第一个 是否登陆,第二是否是预览。 如果是登陆的用户或或者是预览就不进行统计。只需修改一下判断即可。

if(is_singular()) {
# 修改为
 if(is_singular() && !is_user_logged_in() && !isset($_GET['preview']) ) {

验证一下结果

随便找一篇文章在留浏览器中打开一下, 比如: https://www.liuhaolin.com/moren/55.html

然后执行一下sql语句。

 select * from wp_postmeta where  meta_key='post-clicks';
+---------+---------+-------------+------------+
| meta_id | post_id | meta_key    | meta_value |
+---------+---------+-------------+------------+
|     166 |      55 | post-clicks | 1          |
+---------+---------+-------------+------------+

到这里就可以看到结果。 之后还有一个问题了,如果调用记录的这个值。 其实之前的代码中已经就答案了,就是 wordpress 提供的函数 get_post_meta

<?= get_post_meta($post->ID, 'post-clicks', TRUE); ?>

如何增加一个统计,就是每天的访问量

原理也和简单,增加一个 meta_Keypost-clicks-today 再增加一个 meat_keypost-record-todaypost-record-today 用来记录今天的时间,如果今天的时间和post-record-today时间不一样就说明是新的一天。如果第一次发现是新的一天,就把 post-clicks-today 的值修改成1, post-record-today 的值修改成今天的日期。如果还是在同一天就post-clicks-today增加1就可以了。这里给出一份完整的代码。

add_action("wp_head", function () {
    if(is_singular()) {
        global $post;
        // 没有记录时间
        if(get_post_meta($post->ID, 'post-record-today', TRUE) === FALSE ) {
            update_post_meta($post->ID, 'post-record-today', date("Y-m-d"));
        }

        $views = (int) get_post_meta($post->ID, 'post-clicks', TRUE);
        update_post_meta($post->ID, 'post-clicks', $views+1);

        // 根据时间判断
        if(get_post_meta($post->ID, 'post-record-today', TRUE) == date("Y-m-d")) {
            // 统计今天的
            $views_today = (int) get_post_meta($post->ID, 'post-clicks-today', TRUE);
            update_post_meta($post->ID, 'post-clicks-today', $views_today+1);
        } else {
            // 新的一天开始了...
            update_post_meta($post->ID, 'post-clicks-today', 1);
            update_post_meta($post->ID, 'post-record-today', date("Y-m-d"));
        }

    }
});

如何使用

获取总的点击

# 获取总的访问量
function senlin_get_post_clicks($post) {
    return get_post_meta($post->ID, 'post-clicks', TRUE);
}

获取今天的点击

# 获取今天的访问量
function senlin_get_post_clicks_today($post) {
    if( date("Y-m-d") == get_post_meta($post->ID, 'post-record-today', TRUE)) {
        return  get_post_meta($post->ID, 'post-clicks-today', TRUE);
    } else {
        return 0;
    }
}

需要注意的地方是获取今天的访问量,需要判断一下。少了判断,有可能会返回昨天的访问次数。