WordPress讓管理員在前臺匿名,避免CDN緩存
編輯:狂族晨曦 來源:WordPress技巧 日期:2017-08-23 閱讀: 5,953 次 8 條評論 » 百度已收錄
自從用上CDN,需要關注的前臺頁面的問題就更多了,因為要避免一些不該被CDN緩存的內容被緩存,導致訪客訪問到不該看到的內容,影響使用體驗。最近,先森發現曾解決過的問題故態復萌。
用了CDN之后比較突出的問題,就是如果一篇文章如果先森登錄之后再去訪問,其他訪客訪問的時候,會顯示“內容管理”、“登出”、評論框會顯示先森的頭像等問題。這個問題其實之前已經處理過了,但是先森wordpress升級之后,發現原本通過WP Super Cache設置的“不要為已知用戶緩存”和“讓已知用戶匿名使他們瀏覽的內容是緩存文件”竟然失效了。查看了下WP Super Cache的版本,發現四周前才更新,并且提示與當前WordPres版本兼容,先森也確定選項已經勾選,但就是不生效,所以就很心塞。

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

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