首页 > 建站/维护 > 如何解决wp-postviews与wp-super-cache冲突导致不计数的问题
2015
08-04

如何解决wp-postviews与wp-super-cache冲突导致不计数的问题


wp-postviews是给文章阅读量进行计数的插件,wp-super-cache是将网站数据缓存为静态化文件的工具,二者都是必备的wordpress插件。然后当二者同时使用时,会产生冲突导致wp-postviews经常会出现不计数或者计数失败的情况。

解决wp-postviews与wp-super-cache冲突

我最近就遭遇了这样的问题,安装的wp-postviews失常,文章阅读数量一直显示为零,或者阅读数量比评论数量还少。大家都在说可能是因为wp-super-cache导致不计数现象。有两种解决方案,1)停用wp-super-cache插件 2)修改后台代码。但是我早就停用了wp-super-cache啊。其实,简单停用这个插件并不能解决问题,需要彻底删除wp-super-cache插件,删除的方法如下:

1、删除%WordPress安装目录%/wp-config.php中define( ‘WP_CACHE’, true );这句话。

2、找到%WordPress安装目录%/wp-content/cache,删除该目录以及目录下所有文件,这个目录下都是缓存文件,删除并不影响网站运行。

3、删除%WordPress安装目录%/wp-content目录下advanced-cache.php和wp-cache-config.php两个文件。

4、删除目录—>>>%WordPress安装目录%/wp-content/plugins/wp-super-cache

果然,在我彻底删除了wp-super-cache插件后,技术恢复正常。但是遗憾的是,wp-super-cache缓存功能再也用不了

后台修改代码让二者都同时运行,这个方案我没有亲自试验过,参见大发最新方法

鉴于wp-postviews和wp-super-cache都是热门插件,所以两个插件冲突不计数的问题已经是个老问题了,但是网上的解决方案并没有真正解决问题,虽然计数了,但是在缓存更新之前是不会更新浏览数的,相信很多强迫症的朋友根本就不能忍受这个问题。到最后只能放弃其中的一个。当然,还有压根就不计数的朋友,这类朋友基本是因为长得太丑。

wp-super-cache是在apache的环境下工作,nginx需要重写配置rewrite规则。如何配置不在本文讨论范围内。

说下wp-super-cahce的原理吧,是把所有的页面转化成静态html,然后再通过30X定向,绕后php直接访问静态html来加速,在有新评论和新文章时会更新缓存,而wp-postviews的原理是每次访问给meta加1,启用cache后不调用php文件了,所以自然不会计数。于是插件的作者通过ajax来增加计数,但是不知道为啥,有时候js不能正确加载,于是手动修改下吧。

编辑wp-postviews.php,在插件目录下哦,找到下面的这段

if ($should_count && defined('WP_CACHE') && WP_CACHE) {
           // Enqueue and localize script here
           wp_enqueue_script('wp-postviews-cache', plugins_url('postviews-cache.js', __FILE__), array('jquery'), '1.64', true);
           wp_localize_script('wp-postviews-cache', 'viewsCacheL10n', array('admin_ajax_url' => admin_url('admin-ajax.php', (is_ssl() ? 'https' : 'http')), 'post_id' => intval($post->ID)));
       }

替换成下面这样,也就是去掉了条件判断。

wp_enqueue_script('wp-postviews-cache', plugins_url('postviews-cache.js', __FILE__),true);
wp_localize_script('wp-postviews-cache', 'viewsCacheL10n', array('admin_ajax_url' => admin_url('admin-ajax.php', (is_ssl() ? 'https' : 'http')), 'post_id' => intval($post->ID)));

然后重新生成下缓存,就OK了。

这时候每次点击的时候后台会更新显示数,但是前台不会更新,下面我们来解决这个问题。

可以通过AJAX和DOM操作来解决。把下面的代码添加到wp-postviews.php中

add_action('wp_ajax_nopriv_show_postview', 'show_postview');
add_action('wp_ajax_show_postview', 'show_postview');
function show_postview(){
   $views_options = get_option('views_options');
   $ID = $_POST["bigfa_view"];
   $custom_fields = get_post_custom($ID);
   $my_custom_field = $custom_fields['views'];
   foreach ( $my_custom_field as $key => $value ) {
       echo str_replace('%VIEW_COUNT%', number_format_i18n($value), $views_options['template']);
   }
   die;
}

这段添加到postviews-cache.js中

jQuery(document).ready(function() {
   var ajax_data = {
       action: "show_postview",
       bigfa_view: viewsCacheL10n.post_id
   };
   $.post(viewsCacheL10n.admin_ajax_url, ajax_data,
   function(data) {
       $('.show-view').html(data);
   });
   return false;
});

默认的调用方法是

<?php if(function_exists('the_views')) {the_views();} ?>

现在替换为

<span><?php if(function_exists('the_views')) {the_views();} ?></span>

这时候我们发现,文章页是正常计数的而且实时刷新,但是首页还是不行啊,这个没办法了,不过可以通过设置wp-super-cache,不缓存首页,这样就完美解决问题了。。

Goodbye,O'Connor.

来源:校赚网朱海涛