如何解决开启 WP Super Cache 缓存时 WP-Postviews 不计数的问题

我还是喜欢你,像日月星辰,经久不息。仲夏时节,气候宜人,大地散发着诱人的清香。五彩斑斓的蝴蝶丰容靓饰,顾盼生姿,体态轻盈的蜜蜂乱欢飞舞,寻香弄绿,一派繁忙的景象。

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

WP Super Cache 是在apache的环境下工作,nginx需要重写配置rewrite规则。关于伪静态配置,可参考下:WordPress 伪静态规则(IIS/Apache/Nginx)

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

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

1
2
3
4
5
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)));
        }

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))); }

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

1
2
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)));

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

1
2
3
4
5
6
7
8
9
10
11
12
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;
}

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

1
2
3
4
5
6
7
8
9
10
11
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;
});

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; });

默认的调用方法是

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

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

现在替换为

1
<span class="show-view"><?php if(function_exists('the_views')) {the_views();} ?></span>

<span class="show-view"><?php if(function_exists('the_views')) {the_views();} ?></span>

或者

1
<span class="show-view">loading..</span>

<span class="show-view">loading..</span>

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

原文地址

到此这篇关于如何解决开启 WP Super Cache 缓存时 WP-Postviews 不计数的问题就介绍到这了。你是唯一的,你是十分独特的,你就是你生命中的第一名。更多相关如何解决开启 WP Super Cache 缓存时 WP-Postviews 不计数的问题内容请查看相关栏目,小编编辑不易,再次感谢大家的支持!

您可能有感兴趣的文章
WordPress站点Gravatar头像前后台不显示的如何解决办法

WordPress做公司官网好吗?会不会显得档次很低?

WordPress主题需要支持https吗?WordPress站点如何如何实现https?

WordPress站点的页面/标签/分类URL地址如何添加.html?

WordPress站点更换了域名后数据库应该如何操作替换新旧域名?