鑒於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.