WordPress让管理员在前台匿名,避免CDN缓存
编辑:狂族晨曦 来源:WordPress技巧 日期:2017-08-23 阅读: 5,553 次 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.capjsj.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.capjsj.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)
转载请注明出处来自https://www.capjsj.cn/make_known_users_anonymous.html
想使用CDN的全缓存,但会出现很多这相关的异常,确实蛋疼~
这个方法不错。
其实你可以把【不要为已知用户缓存】选项取消勾线,问题就解决了。
试了各种方法,启用了cdn之后网站登录各种出问题,最大的问题就是 登陆之后不显示登录,然后要点开没有缓存的页面,才能显示登录信息,点击首页又是未登录状态(其实已经登录了)。
@CE安全网: 大佬,加了CDN之后,最好不要让前台显示登录状态哦,我们应该做的是尽量避免这种情况。不然,评论区,你的或者别人填的邮箱地址就泄露了。
@狂族晨曦: 我用的腾讯的CDN,各种配置各种蛋疼的问题一堆。。ε=(´ο`*)))唉
目前发现的问题:1.主题自定义时会提示权限不足;2.使用wordfence插件查看扫描文件差异时无法跳转相应页面
很好的文章,正需要,先试试