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_key
为 post-clicks,meta_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_Key
为 post-clicks-today
再增加一个 meat_key
为 post-record-today
。post-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;
}
}
需要注意的地方是获取今天的访问量,需要判断一下。少了判断,有可能会返回昨天的访问次数。