解决WP-PostViews Plus与W3 Total Cache冲突导致文章浏览数显示问题
最近在升级博客后台程序和升级主题程序,用了WP-PostViews Plus统计和显示文章浏览数插件之后,发现在代码里加了如下语句,主页的文章浏览数显示不出来。
1 |
<?php if(function_exists(the_views)) {the_views('', true);}?> |
百思不得其解。最后终于找到了原因,我的博客同时也用了W3 Total Cache做缓存插件,这个插件会事先把所有页面转化成静态html并缓存在服务器,然后再通过重定向,绕过php直接访问静态html资源来加速,在有新评论和新文章时会更新缓存。启用后造成调用php获取浏览数的函数失败。WP-PostViews Plus相比前身WP-PostViews已经解决不计数问题,但是首页显示浏览数还是会有问题。所以解决的方法就是,通过ajax来异步获取浏览数,而不是在php里直接调用函数。
首先,在主题目录的index.php或者你需要的页面上加入一段ajax请求的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!-- ajax post view --> <script type= "text/javascript" > jQuery(document).ready(function() { var postIdList = ""; $("article").each(function(){ postIdList += $(this).attr('id') + ","; }); postIdList = postIdList.substr(0, (postIdList.length - 1)); var ajax_data = { action: "show_postview", postid_list: postIdList }; $.post("<?php echo admin_url(); ?>admin-ajax.php", ajax_data, function(data) { var dataObject = JSON.parse( data ); $("article").each(function(){ $(this).find("span:eq(4)").html(dataObject[$(this).attr('id')] + " 浏览数"); }); }); return false; }); </script> |
其次,修改插件目录wp-content/plugins/wp-postviews-plus/下的wp-postviews-plus.php文件,加入如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
/*解决缓存插件与浏览技术插件冲突*/ add_action('wp_ajax_nopriv_show_postview', 'show_postview'); add_action('wp_ajax_show_postview', 'show_postview'); function show_postview(){ global $wpdb; $postidArray = explode(',', $_POST["postid_list"]); if(count($postidArray) > 0) { $post_view_sql = "select t.post_id,t.meta_value from wp_postmeta t where t.meta_key='views' and t.post_id in (" . $_POST["postid_list"] . ")"; $post_botview_sql = "select t.post_id,t.meta_value from wp_postmeta t where t.meta_key='bot_views' and t.post_id in (" . $_POST["postid_list"] . ")"; $post_view_results = $wpdb->get_results($post_view_sql); $post_botview_results = $wpdb->get_results($post_botview_sql); $articleArray = array(); foreach ($post_view_results as $view_row) { $articleArray[$view_row->post_id] = intval($view_row->meta_value); } foreach ($post_botview_results as $botview_row) { if(isset($articleArray[$botview_row->post_id])) { $articleArray[$botview_row->post_id] = $articleArray[$botview_row->post_id] + intval($botview_row->meta_value); } else { $articleArray[$botview_row->post_id] = intval($botview_row->meta_value); } } foreach ($postidArray as $postid) { if($postid != "" && !isset($articleArray[$postid])) { $articleArray[$postid] = 0; } } echo json_encode($articleArray); } else { echo "Post Data Is Error!"; } die; } |
这样,在缓存成静态页面的时候,js代码会被保留下来,从而在加载页面的时候调用,通过ajax请求后台php获取浏览数数据。这样就解决了这个冲突问题。