WordPress缓存导致文章阅读数点赞数不更新的解决办法

tengxunyun cera

WordPress缓存导致文章阅读数点赞数不更新这个问题应该很多WordPress站长遇到过,因为WordPress提速最简单的就是缓存,这种方案也收到广大个人站长的一致追捧,然而一缓存网页就成静态了,不会有PHP交互也就不会更新数据,难道缓存和阅读计数不能同时拥有吗?当然有而且还不止一种,天无绝人之路嘛,下面就是一种解决整个页面被缓存而导致文章阅读数点赞数不更新的解决办法。

先声明下,由于原理一样,我这里就用阅读数做例子,点赞数就不讲了。并且这个办法不适用于内存缓存,因为内存缓存失效时还是会执行PHP代码计数的,使用这个方法的话会导致阅读数不够准确。如果是内存缓存用户,建议使用水煮鱼的方案,将阅读数存到内存中,等数量到了指定界限时,一次性写入阅读数,不过这样会出现阅读数无法及时更新的尴尬情况。

 

解决办法:使用ajax获取文章阅读数量并刷新网页中阅读数量的HTML标签,服务器收到请求后,同时将原来的阅读数量加1并更新到数据库中。说到这里最关键的内容就是ajax提交请求了,既然是请求那就需要接口了,不然不知道请求谁呀,下面是一个简单的请求接口,大家参考下。

PHP接口文件
将下面的代码复制保存为views.php文件,并放在主题目录下的action目录中,没有就新建一个action文件夹。

require( dirname(__FILE__).’/../../../../wp-load.php’ );
nocache_headers();
$post_ID = isset($_POST[‘post_ID’]) ? (int) $_POST[‘post_ID’] : 0;
if ($post_ID!=0 ) {
$post_views = (int) get_post_meta($post_ID, ‘views’, true);
if (!update_post_meta($post_ID, ‘views’, ($post_views + 1))) {
add_post_meta($post_ID, ‘views’, 1, true);
}
$post_views = (int) get_post_meta($post_ID, ‘views’, true);
print_r(json_encode(array(‘error’ => 0, ‘views’ => 1, ‘response’ => $post_views)));
exit;
}else{
print_r(json_encode(array(‘error’ => 1, ‘views’ => 0, ‘response’ => $post_views)));
exit;
}
上面第一行代码是引入WordPress函数核心支持,没有这个文件我们就不能使用WordPress提供的函数。接着输出响应头部无缓存,然后判断post参数post_id这个是用来区分是哪篇文章的,没接收到就赋值0,后面就是一些逻辑操作和存储自定义字段内容的函数,就不多做解释了,最后以json数据的形式输出提交的详情和阅读数量。

注意:add_post_meta函数存储的自定义字段根据你自己的阅读数量字段修改,我使用的是大前端dux的文章阅读数量字段。

jQuery请求数据
把上面的文件存储到服务器中,我们就可以使用下面的代码来执行js操作请求数据,在这之前先说一下,jQuery必须在下面js之前引用,并且下面js在加载前HTML必须先加载,否则无效。

//获取阅读数
function getpostviews(postid){
$.ajax({
type: “POST”,
url: ‘https://www.xxx.com/wp-content/themes/dux/action/views.php’,
dataType: “json”,
data: {“post_ID”: postid},
success: function(data, textStatus, xhr) {
if (data.error){ return false;}else{
$(“.postviews”).text(“阅读(”+data.response+”)”);
}
}
});
}
上面的postviews是我的文章阅读数量HTML标签的class名称,根据自己的主题修改,然后在主题的文章页模板single.php中写输出js代码:

?>
当然,除了文章页,页脚也可以输出,不过为了避免在页面中加载这个函数,所以我们可以使用is_single函数判断下是不是文章页,代码简单这里就不说了。具体效果见本站,这种方法适用于被腾讯CDN或者其它CDN缓存了整个页面的情况,也适用于被WordPress插件wp_super_cache缓存了整个页面的情况,这里就不一一举例了,试试看就知道效果。唯一的缺点就是有些浏览器如果禁止执行js,那么我们的阅读数就失效了,还有就是js执行post操作需要时间,如果用户打开一瞬间就关闭网页,那么阅读数量也是无法更新的。

cera cloudiplc

相关推荐

腾讯云CDN内容分发缓存导致首页内容不更新的解决办法

这几天一直在折腾WordPress缓存的问题,目前代码狗已经能做到0查询,不过我却没有将0sql技术使用起来,可能有朋友会问为什么,我的回答是不实用。看水煮鱼的博客够快吧,页面生成时间都不到1ms算是快到闪电了。可是那又如何,以我的网络访问他的站也得耗费接近1秒钟。费尽心思到最后用户体验与那些只做了简单缓存的站没多大区别,还得放弃一些动态数据的效果,我实在是不需要这种0查询效果。再次劝各位一句,0sql是门技术,但是使用起来也得考虑自身情况适不适合这么技术,在满足你需求的情况下最大限度的降低数据库查询次数,才是我们学习0sql技术的最终目的! 说了这么多。有些扯远了,再说今天的主题,解决腾讯云cdn内容分发缓存导致网站首页不更新的解决办法,写这篇文章是因为我在折腾0sql的技术时被腾讯的cdn搞得头大。先说说我出现这个问题的情形,每次在更新文章后,在首页看不见新更新的文章,但是分类页下文章却是正常的。最开始我以为是我服务器缓存的问题,首先刷新memcached缓存数据,结果毫无作用,然后关掉memcached缓存服务,没有效果。然后关掉redis缓存服务(虽然我没启用),仍然没有效果,调整wp-config.php文件,关闭所有缓存,还是没效果。这时候我的心情是十分难受的,最后只能放大招——重启服务器,然而并没有什么卵用。重启后浏览器清空缓存Ctrl+F5强刷,还是没用。难道这个问题就没法解决了?这几天搞缓存搞得我头晕,冷静了一会儿后,我决定通过浏览器的响应头找出这个问题出现在哪儿!我的响应头如下: 可以看到响应地址是腾讯的CDN服务器,然后响应状态也正常。在响应头部header中我发现了几个特殊数据,服务器数据过期时间我设置的是1个小时。这里的数据记录时间居然是早上??看来出问题的不是我的服务器。接着看到有个server字段,看不懂百度了一下发现这是腾讯的cdn服务。突然想起了前几天从阿里云cdn换到了腾讯云CDN,很有可能配置上有点问题。然后看到有个缓存信息字段后面显示命中字样,我真是……有苦说不出。 解决办法 主要是cdn缓存策略问题,值得注意的是需要调整一下优先级,否则即使你设置了动态文件不缓存,首页也会给你缓存下来的。下图是我的优先级,切记一定要将动态文件的优先级设置为最高! 你以为排在第一优先级就最高了?想多了,腾讯就是不按套路来,排在最下面的优先级才最高!记住啦,排在最下面优先级最高!所以正确的设置应该是下面这样。 至于设置了动态文件不缓存,还要不要设置首页规则就看你自己了,我是设置了的反正设置上又不收费,无所谓咯。然后等待cdn部署,完成后的请求如下图: 我们可以看到X-Cache-Lookup字段出现了命中信息,查阅一番后知道这是腾讯cdn未命中的意思,更多命中信息如下: X-Cache-Lookup:Hit From MemCache 表示命中CDN节点的内存 X-Cache-Lookup:Hit From Disktank 表示命中CDN节点的磁盘 X-Cache-Lookup:Hit From Upstream 表示没有命中CDN 刷新下网站,首页内容也能随时更新显示出来了,memcached缓存启动起来,一切正常,到此问题圆满解决。

WordPress博客网站使用Memcached和Redis缓存哪个更好|

今天小白得到了一台4核8G的服务器,马上安装上宝塔。接下来就遇到了一个选择困难综合征。到底给数据库安装那种缓存好。是Memcached缓存,还是Redis缓存?接下来小白将详细分析下这两种的区别。 首先,我们今天研究的大前提是#wordpress#博客,那么注定数据量不会太大。访问量也不是超多那种。 一、#Memcached#和#Redis#区别 1、数据存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。 2、数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。 3、使用底层模型差别 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。 4、#value#值大小不同 redis最大可以达到1GB,而memcache只有1MB。 二、Memcached和Redis哪个更适合WordPress 根据上面对比我们发现memcached为内存存储,其占用量最大就512MB内存。而Redis可以无限大占用内存和硬盘空间。memcached更适合存储简单的值。所以小白得出的结论是针对内容不多的WordPress博客建议选择用memcached做MySQL数据库的缓存。 但是这里也有一种例外,有些采集站大佬。因为数据量超多。大部分都超过10万篇文章。那种还是用Redis吧。毕竟有这么多内容的服务器配置应该也不低吧。 以上就是今天要介绍的所有内容,如果有错误欢迎留言指出。

WordPress 捐赠插件漏洞|导致网站遭受零日攻击

使用“Total Donations”插件的WordPress网站,Defiant 建议网站管理员从他们的服务器中删除该插件,防止黑客利用其代码漏洞攻击网站。   过去一周,来自 Defiant 的安全专家观察到了使用 “Total Donations” 插件会导致网站遭受零日攻击。Defiant 是 专门制作 WordPress 防火墙插件的公司。 此次漏洞覆盖所有版本的 “Total Donations” 插件。“Total Donations”是一个商业插件,网站管理员一直用来在网站收集和管理网站捐赠,目前已经放弃维护。 据研究人员 Mikey Veenstra 称,该插件的代码包含几个设计缺陷,这些缺陷从整体上将插件和 WordPress 网站暴露在不安全的环境中,在周五发布的一份安全警报中,Veenstra 表示,该插件包含一个 Ajax 代码,任何未经验证的远程攻击者都可以使用该代码操作改插件。 Ajax 代码存放在插件的一个文件中,这意味着停用插件并不能消除威胁,因为攻击者只需直接调用该文件,所以只有删除整个插件才能保护站点免受攻击。 该Ajax 代码允许攻击者更改任何 WordPress 站点的核心设置项的数值,更改插件相关的设置,修改通过插件收到的捐款的目标帐户,甚至检索 Mailchp 邮件列表。 “Total Donations”的开发商目前已经停止该插件的开发,该公司在 CodeCanyon所有插件目前已全部停止下载。作为一个商业产品,该插件不会有一个庞大的用户群。但该插件最有可能安装在拥有大量用户群的 WordPress 网站上,这些网站是黑客的主要目标。

同一服务器多个WordPress站点使用Memcached冲突的解决办法

缙哥哥开启了一个公益站点“琅嬛百科”,方便大家检索中医药相关的内容,由于需要经常搜索,所以开启了 Memcached 内存缓存,以便减少服务器压力,提高访问速度,改善用户体验度。由于跟缙哥哥博客放在同一台服务器上,开启后自动跳转到博客地址…… 缙哥哥就纳闷了,明明数据库不是同一个,数据库前缀也不同,网站文件也不同,怎么就冲突了呢?后来一想就明白了,用的是同个内存啊,既然如此,用 CACHE_KAY 把两个网站区分开就好了嘛! 区分Memcached缓存 进入WordPress站点根目录,编辑根目录下的wp-config.php文件,在 /* 好了!请不要再继续编辑。请保存本文件。使用愉快! */ 该代码注释上方添加以下代码 /* 同服务器多站点Memcached内存缓存分离 – https://www.dujin.org/12476.html */ define(‘WP_CACHE_KEY_SALT’, ‘www.dujin.org’); 这里引号中间 www.dujin.org 只是为了与其他站点区别 Memcached 缓存数据,避免冲突而已,你可以改成自己的网址,也可以不改。记得保存 wp-config.php 文件,然后重启下(个人建议)就OK了!

微信扫一扫,分享到朋友圈

WordPress缓存导致文章阅读数点赞数不更新的解决办法