前言
WordPress开启CDN静态缓存页面之后,当我们访问文章的时候,便不会去请求源站,而是返回CDN缓存了的页面,所以文章的浏览数量不会进行自增以及其他的变化。
解决办法
解决这个问题,我们可以通过Ajax来异步请求服务器,然后再进行文章的浏览数量自增或其他的操作。(注:本方法仅适用于使用了WP-PostViews插件或者和具有WP-PostViews相同字段的博客,若你的文章统计字段不同,可自行修改下方SQL语句以达到效果)
首先,我们在网站的根目录新建一个操作文件,命名为views.php
,将以下代码写入此文件中。
<?php require('wp-blog-header.php'); ?> <?php $ajaxHead = $_SERVER['HTTP_X_REQUESTED_WITH']; if(strtoupper($ajaxHead)==strtoupper("XMLHttpRequest")) { $post_id = $_POST['post_id']; echo $post_id; $sql = "update `wp_postmeta` set `meta_value`=`meta_value`+1 where `post_id`='${post_id}' AND `meta_key`='views';"; $wpdb->query($sql); }else{ header("HTTP/2 404 Not Found"); header("Status: 404 Not Found"); exit; }
根据@张戈博主提供的建议与信息,将浏览量记录操作做了过滤以及部分优化,但是由于在服务器端进行验证的话如果不使用Redis等缓存,操作量以及存储的Cookie数据可能会比较多,于是我换了一种方式来进行验证过滤(JavaScript部分),代码如下:
<?php /** * @author Licoy.cn * @version 2017/8/8 */ require('../../wp-blog-header.php'); $isXhr = $_SERVER['HTTP_X_REQUESTED_WITH']; if (strtoupper($isXhr) == strtoupper("XMLHttpRequest")) { $post_id = $_POST['post_id']; $po = get_post_meta($post_id,'views',true); if(!$po) { //表示不存在这个自定义栏目,那么新增这个自定义栏目 add_post_meta($post_id, 'views', 1, true); echo 1; } else { // 若已存在这个自定义栏目,则先获取当前数值,并递增+1,再更新数据库 $count = $po + 1; update_post_meta($post_id,'views',$count); echo $count; } } else { header("Status: 403 Not Found"); exit; }
接着我们在主题的page.php文件中插入以下代码:
$(function(){ function page_views() { if(!window.localStorage) { console.info('浏览器不支持localStorage'); }else{ var post_id = <?php the_ID();?>; var views = localStorage.getItem("view_list"); if(views===null){ localStorage.setItem("view_list",post_id); $.post("/views.php?time="+new Date().getTime(),{post_id:post_id}); return true; }else{ var item = views.split("|"); var bool = $.inArray(post_id+'',item); if(bool===-1){ $.post("/views.php?time="+new Date().getTime(),{post_id:post_id}); localStorage.setItem("view_list",views+"|"+post_id); return true; } return false; } } } page_views(); });
到这一步,就已经成功解决了这个问题。
一定要用WP-PostViews插件等才会更新吗?主题自带的也是views,但还是不更新。 views.php是不是要放到主题根目录的。
@ant 是要放到根目录
@憧憬Licoy 我用了,但是没有用。是什么原因。
我在page.php最开头里面加了alert好像都没有用。(alert功能是没有问题的)
//是不是少了这个?
$(function(){
啊谢谢巨佬提供的方法!
文章不错支持一下,非常喜欢
不错的解决思路
@程门立学
眼福博客来访,流量大涨!刚好找这解决方法。
@美女图片 ok
这个我倒是没有关注过,我有那个统计浏览数的插件,开启缓存后我就直接在后台设置为“Use AJAX To Update Views”中选择YES就不管了。
@懿古今 哈哈,那个应该有这类的功能
博主,现在的代码路径是不是有点问题
@分享喵 请根据自己的网站实际结构调整。
« 1 2 3 4
SpringCloud使用Zuul出现“Forwarding error”错误解决方法
Chatroulette-全世界随机视频聊天网站
IntelliJ IDEA下将JavaWeb打包成war包并发布到tomcat步骤说明
LiRecord留言板系统V2.0正式版发布
SpringBoot打包成war包并放置在tomcat运行
SpringBoot+Shiro整合进行登录验证与权限控制
多风格自适应WordPress主题Puock正式开源!
非大众版WordPress纯代码实现阅读量统计
面包多WordPress插件 – 把你的文章变成付费版
git reset —hard后暂存区代码跑哪儿去了?
选择表情
分享至