网站建设

实现WordPress提交评论的时删除该页面的WP-Super-Cache缓存的方法

Jager · 10月18日 · 2014年 · 3714次已读

这篇文章依然是围绕缓存问题展开的,lnmp 环境下的 WordPress 使用 WP-Super-Cache 插件,若要开启 mod_rewrite 缓存模式,需要在 nginx 里面加入一些特定的规则,具体请见旧文:《nginx 下 wp super cache 的 mod_rewrite 规则》。

用过 WP-Super-Cache 插件的应该都知道,在高级设置里面有一项【当某页面有新评论时,只刷新该页面的缓存】的功能,从字面上来说,就是当有人在某篇文章发起评论时,将删除该页面的缓存。

但是,经过我仔细测试发现,这个功能在我的博客并没有生效,个人猜测失败的原因可能是使用了 ajax 无刷新评论导致的。也就是采用 ajax 评论的方式,可能无法触发 WP-Super-Cache 的删除机制,从而导致这个功能的失效!总之,不管怎么样,反正在我的博客失效了,现在就要想办法解决这个问题。

既然你不行,那就我来!

简单的加上几句并不高端的 PHP 代码后,就实现了这个功能:

编辑主题下的 comments-ajax.php 文件(启用 ajax 评论的博客才有),找到如下代码:

do_action('pre_comment_on_post', $comment_post_ID);

然后,在这行代码之后添加删除缓存代码,保存即可:

//有人评论将自动删除已存在缓存
$post_data = get_post($post->ID, ARRAY_A);
$slug = $post_data['post_name'];
$cache_s = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$post->ID.".html/index.html";
$cache_sd = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$post->ID.".html";
$cache_p = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$slug."/index.html";
$cache_pd = WP_CONTENT_DIR."/cache/supercache/".$_SERVER['SERVER_NAME']."/".$slug;
if (file_exists($cache_s)) {
    unlink($cache_s);
    rmdir($cache_sd);
 }
if (file_exists($cache_p)) {
    unlink($cache_p);
    rmdir($cache_pd);
    }

现在有人提交评论时,将会判断是否存在该页缓存,如果存在就删除,从而实现了我要的功能。

本来想用 is_page() 和 is_single()来判断页面内容,从而简化代码的,可惜不生效,至少用上面的笨方法了!反正能实现就可以了。

12 条回应
  1. 民间偏方大全 2014-10-19 · 11:51

    确实记不住之前填写的信息了。

  2. 成都SEO 2014-10-19 · 12:59

    额,俺们小站流量不大,暂时用不着。
    话说啥事lnmp是linux+ngnix+mysql+php?

    • avatar
      Jager 2014-10-19 · 14:04

      正解~

  3. 飞哥 2014-10-19 · 18:46

    Jager。请问如何wordpress 精简js文件和css文件,你是怎么处理的呢?

    • avatar
      Jager 2014-10-20 · 9:08

      合并的合并,压缩的压缩,百度一下你就知道。

  4. 会跳舞的红绿灯 2014-10-20 · 10:24

    那我这条评论能成功吗??

  5. lock 2015-8-17 · 18:30

    话说6,7行是删除首页缓存?

  6. Oeasy 2017-5-6 · 10:55

    同知更鸟主题 启用了ajax评论 找不到comments-ajax.php文件

  7. 明月登楼 2017-11-6 · 16:45

    我目前在 W3 Total Cache 插件里也碰到这个问题了!博主 W3 Total Cache 下应该如何弄呀?

  8. 对象缓存 2019-1-15 · 21:26

    如果是使用了对象缓存memcached,提交评论没有触发刷新缓存页面,该如何修改删除缓存呢?
    谢谢

  9. 心源 2019-1-16 · 18:52

    有更简单的办法,判断评论状态改变调用wp super cache刷新单个页面缓存函数
    把下面的代码加入主题functions.php文件即可。

    // 评论状态发生改变时,执行此动作函数。新状态可能是("delete", "approve", "spam", "trash")。
    add_action('wp_set_comment_status', 'refresh_single_cache');

    function refresh_single_cache(){

    global $comment;
    wp_cache_post_change( $comment->comment_post_ID );// 更新评论页面缓存
    }

    • avatar
      Jager 2019-1-20 · 13:43

      看来是有内置函数