WordPress讓管理員在前臺(tái)匿名,避免CDN緩存
編輯:狂族晨曦 來(lái)源:WordPress技巧 日期:2017-08-23 閱讀: 6,050 次 8 條評(píng)論 » 百度已收錄
自從用上CDN,需要關(guān)注的前臺(tái)頁(yè)面的問(wèn)題就更多了,因?yàn)橐苊庖恍┎辉摫籆DN緩存的內(nèi)容被緩存,導(dǎo)致訪客訪問(wèn)到不該看到的內(nèi)容,影響使用體驗(yàn)。最近,先森發(fā)現(xiàn)曾解決過(guò)的問(wèn)題故態(tài)復(fù)萌。
用了CDN之后比較突出的問(wèn)題,就是如果一篇文章如果先森登錄之后再去訪問(wèn),其他訪客訪問(wèn)的時(shí)候,會(huì)顯示“內(nèi)容管理”、“登出”、評(píng)論框會(huì)顯示先森的頭像等問(wèn)題。這個(gè)問(wèn)題其實(shí)之前已經(jīng)處理過(guò)了,但是先森wordpress升級(jí)之后,發(fā)現(xiàn)原本通過(guò)WP Super Cache設(shè)置的“不要為已知用戶緩存”和“讓已知用戶匿名使他們?yōu)g覽的內(nèi)容是緩存文件”竟然失效了。查看了下WP Super Cache的版本,發(fā)現(xiàn)四周前才更新,并且提示與當(dāng)前WordPres版本兼容,先森也確定選項(xiàng)已經(jīng)勾選,但就是不生效,所以就很心塞。

發(fā)現(xiàn)問(wèn)題,處理問(wèn)題。
先森冒著英語(yǔ)超爛的風(fēng)險(xiǎn),去了WP Super Cache的插件頁(yè)面,看了一圈問(wèn)題討論,就是沒(méi)發(fā)現(xiàn)有人提這個(gè)BUG的,在官方找解決方案的道路失敗了。也不知道新的版本什么時(shí)候發(fā)布,發(fā)布會(huì)不會(huì)包含解決這個(gè)問(wèn)題,所以先森只能又冒著php一知半解的風(fēng)險(xiǎn)來(lái)寫(xiě)代碼了。
解題思路
解決方式先森覺(jué)得有兩種,一個(gè)是去把自己的主題中的前臺(tái)中管理員登錄后才會(huì)顯示的代碼給刪掉,另一種就是讓管理員在前臺(tái)匿名,被認(rèn)為沒(méi)有登錄。
第一種方案,先森覺(jué)得有點(diǎn)費(fèi)時(shí)費(fèi)力。當(dāng)初主題的代碼是自己一行一行的寫(xiě)的,現(xiàn)在讓自己去刪,內(nèi)心表示很痛苦啊(心中憧憬著哪天要是不用CDN了...)。
所以先森還是想實(shí)現(xiàn)第二種方案。
經(jīng)過(guò)研究自己的主題,先森發(fā)現(xiàn),會(huì)顯示管理員才能看到的東西,大多使用了這樣的一種套路:
<?php if (is_user_logged_in()){
'我是管理員'
} ?>
都用的is_user_logged_in()這個(gè)函數(shù)來(lái)判斷用戶是否登錄,所以先森就想,讓這個(gè)函數(shù)返回“用戶沒(méi)有登錄”豈不是就可以了?
is_user_logged_in()函數(shù)介紹:is_user_logged_in()函數(shù)位于wp-includes/pluggable.php
函數(shù)參數(shù):該函數(shù)不接受任何參數(shù)。
返回值:已登陸返回True,否則返回False。
先森在函數(shù)所在位置,找到了這個(gè)函數(shù)的代碼:
if ( !function_exists('is_user_logged_in') ) :
/**
* Checks if the current visitor is a logged in user.
*
* @since 2.0.0
*
* @return bool True if user is logged in, false if not logged in.
*/
function is_user_logged_in() {
$user = wp_get_current_user();
return $user->exists();
}
endif;
先森把上面的return內(nèi)容改成了如下內(nèi)容:
if(!is_admin()){
return false;
}else{
return $user->exists();
}
這樣之后,只要不是后臺(tái),就會(huì)返回false,這樣前臺(tái)就會(huì)得到管理員沒(méi)有登錄。先森發(fā)現(xiàn)使用了is_user_logged_in()函數(shù)的位置都已經(jīng)不會(huì)在登錄的情況下顯示了,但是還有兩個(gè)地方例外。
第一個(gè)地方是文章頁(yè)面上的“編輯”按鈕,另一個(gè)就是評(píng)論的頭像了。
通過(guò)查看代碼,先森發(fā)現(xiàn)編輯按鈕用的是edit_post_link()函數(shù):
edit_post_link('編輯', ' | ', '');
函數(shù)說(shuō)明:
若用戶已登錄且具有編輯文章的權(quán)限,該標(biāo)簽顯示一個(gè)可編輯當(dāng)前文章的鏈接。該標(biāo)簽必須用在主循環(huán)(loop)中。
這個(gè)函數(shù)就沒(méi)有使用is_user_logged_in()函數(shù)了,所以通過(guò)修改is_user_logged_in()的返回值就對(duì)“編輯”按鈕不生效了。
再來(lái)看評(píng)論頭像。修改了is_user_logged_in()的返回值之后,頭像旁邊的文字已經(jīng)變成了未登錄狀態(tài)下的文字,但是頭像依然是先森的管理員評(píng)論頭像。
再去查看代碼,發(fā)現(xiàn)評(píng)論頭像部分雖然也使用了is_user_logged_in()函數(shù),但是還另外使用了一個(gè)全局變量,代碼大致如下:
global $current_user; get_currentuserinfo(); ... echo get_avatar( $current_user->user_email, $size = '48' ,'');
這樣是通過(guò)獲取當(dāng)前用戶信息,然后來(lái)獲取用戶的email郵箱地址,這樣就和is_user_logged_in()函數(shù)無(wú)關(guān)了,因此前臺(tái)還是會(huì)顯示管理員的頭像。
但也正是這個(gè)問(wèn)題,讓先森找到了解決的辦法。
讓管理員在前臺(tái)匿名
評(píng)論頭像是通過(guò)獲取當(dāng)前登錄用戶的相關(guān)信息,進(jìn)而獲取用戶郵箱來(lái)顯示頭像的。用到的獲取用戶信息函數(shù)是:
get_currentuserinfo()
而其實(shí)看is_user_logged_in()函數(shù),其實(shí)它也有獲取當(dāng)前用戶的相關(guān)信息,但用的是另一個(gè)函數(shù):
$user = wp_get_current_user();
而這兩個(gè)函數(shù),其實(shí)是同一個(gè)函數(shù),只是wp_get_current_user()是get_currentuserinfo()的進(jìn)階版:
Notice: 自4.5.0版本起,已不建議使用get_currentuserinfo,請(qǐng)換用wp_get_current_user()。 in ***\wp-includes\functions.php on line 3707
既然如此,只需要讓當(dāng)前用戶信息為空即可。
在自己的主題function.php最后加入以下代碼,那么在前臺(tái)就用戶信息就為空了,即獲取不到用戶信息了:
/*
** 讓管理員在前臺(tái)訪問(wèn)匿名
** //www.cnidcc.cn/make_known_users_anonymous.html
*/
function make_known_users_anonymous() {
global $current_user;
if(!is_admin()){
$current_user = array(
'user_login' => '',
'user_email' =>'',
'user_level' => '',
'user_firstname' => '',
'user_lastname' => '',
'display_name' => '',
'ID' => '',
'user_url' => '',
);
}
return $current_user;
}
add_action( 'init', 'make_known_users_anonymous' );
如果想要調(diào)試的話,可以把以下代碼放在前臺(tái)頁(yè)面中想放的位置:
<?php
global $current_user;
get_currentuserinfo(); //或者將這兩行換成 $current_user = wp_get_current_user();
if( is_user_logged_in()){
echo '已經(jīng)登錄';
}else{
echo '沒(méi)有登錄';
}
echo('Username: ' . $current_user->user_login . "\n"); //輸出用戶名
?>
但目前這種方式有個(gè)BUG,那就是在文章編輯頁(yè)面點(diǎn)擊預(yù)覽的時(shí)候會(huì)返回404,這個(gè)待先森找找解決方法。
2017-09-01更新
先森看了下,預(yù)覽的頁(yè)面會(huì)在文章鏈接后面加上“?preview=true”或者“?p=xxx&preview=true”,那么,當(dāng)訪問(wèn)鏈接是帶了“preview=true”的,就不清除登錄信息就行了。那么,把上面的匿名代碼改成下面的代碼,加入functions.php中
/*
** 讓管理員在前臺(tái)訪問(wèn)匿名
** //www.cnidcc.cn/make_known_users_anonymous.html
*/
function make_known_users_anonymous() {
global $current_user;
if(!is_admin() && $_GET['preview'] != 'true'){
$current_user = array(
'user_login' => '',
'user_email' =>'',
'user_level' => '',
'user_firstname' => '',
'user_lastname' => '',
'display_name' => '',
'ID' => '',
'user_url' => '',
);
}
return $current_user;
}
add_action( 'init', 'make_known_users_anonymous' );
如果有任何問(wèn)題,可以在下方評(píng)論。
關(guān)于訪客填寫(xiě)的昵稱、郵箱、域名等信息不被CDN緩存,可以看看先森的解決方案:
歷史上的今天:
轉(zhuǎn)載請(qǐng)注明出處來(lái)自http://www.cnidcc.cn/make_known_users_anonymous.html

川公網(wǎng)安備 51011202000104號(hào)
想使用CDN的全緩存,但會(huì)出現(xiàn)很多這相關(guān)的異常,確實(shí)蛋疼~
這個(gè)方法不錯(cuò)。
其實(shí)你可以把【不要為已知用戶緩存】選項(xiàng)取消勾線,問(wèn)題就解決了。
試了各種方法,啟用了cdn之后網(wǎng)站登錄各種出問(wèn)題,最大的問(wèn)題就是 登陸之后不顯示登錄,然后要點(diǎn)開(kāi)沒(méi)有緩存的頁(yè)面,才能顯示登錄信息,點(diǎn)擊首頁(yè)又是未登錄狀態(tài)(其實(shí)已經(jīng)登錄了)。
@CE安全網(wǎng): 大佬,加了CDN之后,最好不要讓前臺(tái)顯示登錄狀態(tài)哦,我們應(yīng)該做的是盡量避免這種情況。不然,評(píng)論區(qū),你的或者別人填的郵箱地址就泄露了。
@狂族晨曦: 我用的騰訊的CDN,各種配置各種蛋疼的問(wèn)題一堆。。ε=(′ο`*)))唉
目前發(fā)現(xiàn)的問(wèn)題:1.主題自定義時(shí)會(huì)提示權(quán)限不足;2.使用wordfence插件查看掃描文件差異時(shí)無(wú)法跳轉(zhuǎn)相應(yīng)頁(yè)面
很好的文章,正需要,先試試