解決WordPress加入CDN后“非插件瀏覽次數(shù)統(tǒng)計(jì)”瀏覽次數(shù)不刷新問(wèn)題
編輯:狂族晨曦 來(lái)源:WordPress技巧 日期:2017-08-25 閱讀: 6,099 次 6 條評(píng)論 » 百度已收錄
不知道多少人和先森一樣,在最初接觸wordpress的時(shí)候,被網(wǎng)上的各類教程灌輸了“能用代碼版,就不用插件”的概念。先森就本著這個(gè)概念,在文章的訪問(wèn)量的時(shí)候,先森就找的代碼版。網(wǎng)上提供的代碼版瀏覽次數(shù)統(tǒng)計(jì)功能的文章,名稱都差不多,類似“WordPress非插件添加文章瀏覽次數(shù)統(tǒng)計(jì)功能”這種比比皆是。
先森應(yīng)該是在wordpress大學(xué)看到的教程,關(guān)于教程先森就不再贅述了。本文主要解決的是,開(kāi)啟CDN后,用這種代碼版訪問(wèn)量統(tǒng)計(jì)的方式瀏覽次數(shù)不再刷新的問(wèn)題,如果想結(jié)合著來(lái)使用的話,統(tǒng)計(jì)代碼部分可以去wordpress大學(xué)看《WordPress非插件添加文章瀏覽次數(shù)統(tǒng)計(jì)功能》這篇文章。

瀏覽次數(shù)
問(wèn)題分析
先森其實(shí)很早就意識(shí)到,開(kāi)啟CDN后,其實(shí)瀏覽量不是不刷新,而是只在首次緩存的時(shí)候才會(huì)增加一次。
因?yàn)橹挥械谝淮卧L問(wèn)的時(shí)候才會(huì)執(zhí)行php,緩存后就直接訪問(wèn)的html了,所以就不會(huì)增加統(tǒng)計(jì)了。所以解決問(wèn)題的方式,是讓html也能統(tǒng)計(jì)到瀏覽次數(shù),先森認(rèn)知中的方法就只有一個(gè):ajax。然而當(dāng)初先森雖然知道問(wèn)題原因,知道解決方式,但奈何先森代碼能力不強(qiáng),當(dāng)時(shí)沒(méi)能解決。
先森始終認(rèn)為,一個(gè)問(wèn)題如果死活解決不了,那么就先放放,過(guò)段時(shí)間再反顧可能就會(huì)發(fā)現(xiàn),這個(gè)問(wèn)題根本就不是事。當(dāng)然,這個(gè)時(shí)間可能就有點(diǎn)久了,起碼就ajax這個(gè)問(wèn)題,先森等了一兩年。。。。
先森想到的用ajax更新瀏覽次數(shù)的方法就是,使用ajax提交文章的ID給后方的php,后方的php接收到文章ID后,將該文章的瀏覽次數(shù)+1。
效果實(shí)現(xiàn)
先森研究了一晚上,發(fā)現(xiàn)要解決還是挺簡(jiǎn)單的。又是研究幾小時(shí),分享幾分鐘,心塞。
首先,在footer.php中添加ajax的代碼,注意url的地址要改為自己的php路徑:
<?php if (is_singular()) : ?>
<!-- ajax post view -->
<!-- ajax post view -->
<script type= "text/javascript" >
$.ajax({
type:'POST',
url: "//www.cnidcc.cn/wp-content/themes/*/*.php" , /*此處需要修改為自己的php路徑*/
data: {
"postviews_id" : "<?php the_ID();?>"
}
});
</script>
<?php endif ; ?>
接收數(shù)據(jù)的php代碼很簡(jiǎn)單,參考了評(píng)論的comments-ajax.php的頭部,禁止直接訪問(wèn),然后加上了幾行更新瀏覽量的代碼。將下面內(nèi)容保存到一個(gè)php文件中,放入自己的wordpress主題里面,將該php的訪問(wèn)鏈接加入到上面的url中:
<?php
//禁止直接訪問(wèn)本php
if ( 'POST' != $_SERVER['REQUEST_METHOD'] ) {
header('Allow: POST');
header('HTTP/1.1 405 Method Not Allowed');
header('Content-Type: text/plain');
exit;
}
require( dirname(__FILE__) . '/../../../wp-load.php' );
nocache_headers();
$post_ID = $_POST['postviews_id'];
$post_views = (int)get_post_meta($post_ID, 'views', true);
update_post_meta($post_ID, 'views', ($post_views+1));
?>
如此一來(lái),即使加入了CDN,文章頁(yè)面變成了靜態(tài)頁(yè)面,后臺(tái)也會(huì)更新訪問(wèn)次數(shù)了。
總結(jié)
這樣僅僅是解決了文章頁(yè)面被緩存后,瀏覽次數(shù)無(wú)法被統(tǒng)計(jì)到的問(wèn)題,但是還并不完善。
上面的功能實(shí)現(xiàn)之后,你會(huì)發(fā)現(xiàn),每一次刷新瀏覽次數(shù)都會(huì)加一,如果有人一直按著F5,那么增加的瀏覽次數(shù)就有點(diǎn)恐怖了。這樣還會(huì)增加服務(wù)器的負(fù)擔(dān),像先森這種把網(wǎng)站放在阿里云虛擬主機(jī)的,若負(fù)載過(guò)量還會(huì)直接關(guān)停,被人這樣搞的關(guān)機(jī)先森就哭了。
所以,下篇文章先森會(huì)分享使用cookies來(lái)限制訪問(wèn)次數(shù)無(wú)限增加的問(wèn)題。
另外,除了訪問(wèn)量持續(xù)增加的問(wèn)題,還有一個(gè)地方可以優(yōu)化。既然ajax能夠異步提交數(shù)據(jù),那么能不能動(dòng)態(tài)的修改文章中的瀏覽次數(shù)呢?答案是肯定的,先森也會(huì)在下一篇文章中更新。
關(guān)于上面的問(wèn)題,請(qǐng)查看下一篇文章:CDN后用Ajax動(dòng)態(tài)提交、顯示文章閱讀量,cookies避免重復(fù)刷新
歷史上的今天:
轉(zhuǎn)載請(qǐng)注明出處來(lái)自http://www.cnidcc.cn/ajax_views.html

川公網(wǎng)安備 51011202000104號(hào)
世間博客不少,風(fēng)景這邊獨(dú)好!
還是老老實(shí)實(shí)用插件吧,計(jì)數(shù)插件小。
感謝分享實(shí)用信息
支持樓主
有一個(gè)問(wèn)題哦,當(dāng)訪問(wèn)的不是緩存內(nèi)容時(shí),刷新一次,閱讀量會(huì)+2
@分享喵: 關(guān)于這個(gè)問(wèn)題,我已經(jīng)在下一篇文章中發(fā)布了解決辦法。下一篇的文章鏈接我已經(jīng)添加在本文末尾,你可以刷新查看。如果還是有CDN緩存的話,你可以點(diǎn)擊評(píng)論區(qū)上面的“下一篇”查看。