WordPress踩坑记:被WP Super Cache页面静态缓存坑了两年的访问量,今天终于治好了!

为啥用子比主题WP Super Cache,后台访问量总是涨得巨慢?跟第三方统计工具差老远!作为用了这组合两年的过来人,我上周刚揪出罪魁祸首——看着注册用户咔咔涨、搜索引擎天天来爬,后台统计却跟 “冻住了” 似的,差点以为自己写的文被互联网拉黑了!后来才发现:未登录用户访问时,缓存直接返回静态 HTML 页面,动态的访问量记录压根没触发,这坑藏得也太深了!

WP Super Cache插件整整两年,直到昨天四凌晨三点,我对着后台可怜的文章访问统计数据抓耳挠腮。一边是每天几十条新用户注册记录,一边是搜索引擎隔天就来抓取的记录,更离谱的是防火墙每天拦截上10万次攻击……

「难道大家都是来注册看空气的?」
猛灌一口冰可乐后突然顿悟:插件导致的把未登录用户全当「空气」了!

原来开启超级缓存后,未登录访客看到的是纯HTML静态页面,JS,CSS图片等,还有动态数据也全被冻住了,连子比主题最基本的「文章访问量」都没法记录!

(此刻想给自己脑门来一拳:早该想到缓存这玩意儿是把「双刃剑」啊!)

📉你可能遇到的两种 “数据异常”与问题诊断

  • 访问量涨得像蜗牛:后台数据几天不动一下,明明有人留言注册,统计却“装死”
  • 多工具数据对不上:三方统计显示有1000访问,WordPress后台只有100,差得离谱

很多用子比主题搭配WP Super Cache插件的朋友可能都遇到过:登录状态下访问文章,浏览量蹭蹭涨;退出登录再访问,数据却纹丝不动。这不是玄学,而是缓存机制的 "副作用"!WP Super Cache会把页面生成纯HTML静态文件,当未登录用户访问时,浏览器加载的是静态资源,压根不会触发WordPress后端的浏览量统计逻辑。而子比主题默认的浏览量记录机制,恰恰依赖动态请求,这就导致"未登录访客 = 隐形人",后台数据自然惨不忍睹。

(亲测!我上周就是看着攻击日志里的IP数,才怀疑缓存搞鬼的🤣)

✅亲测修复!10分钟让访问量“活过来”

要解决这个问题,核心思路是:在静态页面加载后,通过前端 JS 发送异步请求,让后端单独处理浏览量记录。具体分两步走:

第一步:JS补刀动态记录(解决静态页面不计数)

代码添加至主题文件func.php

function wxs_viewadd_footer(){
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
    // 仅在文章页面且用户未登录时执行
    if (typeof isArticlePage !== 'undefined' && isArticlePage === true && !isUserLoggedIn) {
        // 使用主题提供的全局变量
        const postId = window._win?.views || 0;
        if (!postId) {
            console.log('缺少文章ID,无法记录浏览量');
            return;
        }
        
        // 检查是否已发送过请求
        const cookieName = 'zib_post_viewed_' + postId;
        
        // 如果没有COOKIE标记,则发送请求
        if (!document.cookie.split(';').some(function(item) {
            return item.trim().indexOf(cookieName + '=') === 0;
        })) {
            // 使用fetch API异步发送请求
            fetch(window._win?.ajax_url || '/wp-admin/admin-ajax.php', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                },
                body: 'action=zib_post_views_ajax&id=' + postId,
                credentials: 'same-origin'
            })
            .then(function(response) {
                if (response.ok) {
                    return response.json();
                }
                throw new Error('Network response was not ok');
            })
            .then(function(data) {
                console.log('文章浏览量已成功记录:', data);
            })
            .catch(function(error) {
                console.error('记录浏览量时出错:', error);
            });
        }
    }
});
</script>
  <?php
}
add_action('wp_footer', 'wxs_viewadd_footer');

这段代码就像个"潜伏特工",当静态页面加载后,先确认是不是文章页、用户有没有登录,再通过Cookie判断是否重复访问,最后用fetch偷偷给后端"报信":"这里有个未登录访客看了文章 ID 为XXX的页面!"

第二步:PHP接口接招(处理AJAX请求+防重复计数)

后端代码则像个"安全计数器",先验证请求合法性,再用Cookie防止短时间内重复计数,最后精准更新文章和对应分类的浏览量数据。特别注意:这里用了wp_ajax_nopriv_前缀,专门处理未登录用户的请求,确保静态页面也能触发计数。

代码添加至主题文件func.php

定义isArticlePage变量,用于确认是否是文章页,代码添加至主题文件func.php

function add_wxs_isArticlePageJS_head(){
?>
<script>
//是否为文章页
var isArticlePage = <?php echo is_single() ? 'true' : 'false' ?>;
</script>
  <?php
}
add_action('wp_head', 'add_wxs_isArticlePageJS_head');

效果验证:数据「活过来」的那一刻,我哭了

几天前的浏览记录

图片[1]-WordPress踩坑记:被WP Super Cache页面静态缓存坑了两年的访问量,今天终于治好了!-王先生笔记

最近的浏览记录

图片[2]-WordPress踩坑记:被WP Super Cache页面静态缓存坑了两年的访问量,今天终于治好了!-王先生笔记

终于知道原来我的读者不是空气,而是实实在在的活人啊!

写给新手的「避坑提醒」

  • 缓存插件≠万能:开启前先确认「哪些功能依赖动态数据」(如评论、统计、用户状态)
  • COOKIE是个好东西:合理利用COOKIE做「防刷 + 去重」,比单纯依赖 IP 更精准
  • 定期查数据矛盾:如果注册量/抓取量≠访问量,大概率是缓存或统计逻辑出了问题

有问题欢迎留言讨论,帮你看看你的站点是不是也被缓存「坑」了!

原文链接(非王先生笔记发布均为盗版):https://wxsnote.cn/6157.html

评论后可接收该文章的更新邮箱通知
友情赞助

如果你喜欢我的内容,可以赞助我哦!你的一点点心意,是我不断前进的动力!
温馨提示: 本文最后更新于2025-07-04 20:22:05,某些文章具有时效性,若有错误或已失效,请在下方留言或加入QQ群: 399019539 联系群主反馈。注意一些链接无法访问可能是你网络的原因,如Github,并非资源地址失效。
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
相关推荐
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容

王先生笔记