自定义WordPress临时维护页面内容
用过WordPress的站长都清楚,WordPress的后台有插件和主题的自动升级功能,这个功能可以自动检查插件中是否存在更新,并提示网站管理员,在得到确认升级后完成下载-解压-更新配置的操作。就算是最简单的插件或者主题,都会存在一个问题,那就是时间延迟的问题。当我们的网站访问量足够大之后,就算是几秒的网站故障也回让不少人看到令人不愉悦的东西(譬如说像是503错误啥的),为了对应这种故障,WordPress想出了一个对策,就是单独建立一个页面在这个维护的时间中显示。然而这个维护的页面也是简单的有够不可思议的。
如果是从HTML代码上来看,这就是个空白页加了个<h1>标签:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>维护</title> </head> <body> <h1>正在执行例行维护,请一分钟后回来。</h1> </body> </html>
于是就产生了一个想法,能否把这个页面替换掉。
最初是问了下度娘,发现大部分都是抄的WP大学的
http://www.wpdaxue.com/wordpress-temporary-maintenance.html
直接自己写一个函数,随后在动网站前把那个代码开起来。这一段代码适合于自己会写PHP的站长们,这样我们在动PHP代码前可以开起来比较方便,不至于出现503的服务器错误,但是如果是不懂PHP的站长,如果并没有可能去动网站的后台代码,那么也就没有必要用这段代码了,而且开这么一个玩意,自己调前端也会比较困难。
网上还有几款插件,功能和WP大学的那个代码功能差不多,也是用于手动开启维护模式。
为了能够改掉WordPress的这个默认的页面,我大致地摸索了一下,在这里放出查找代码的思路和实现的方法。因为需要写一些HTML代码什么的,所以,伸手党可能在这里无法得到很好效果的解决方案。
作为一款舶来的博客系统,WordPress官方在核心中使用的提示语言必定会是英语,而WordPress的其他语言用的是一种扩展名为.mo的语言包(.po是未编译的版本,.mo是编译压缩过的版本),通过WordPress自身的翻译系统即可翻译为新的语种。那么这句”正在执行例行维护,请一分钟后回来。”也必定是翻译后的结果,如果要全站代码搜索的话,也必须要先翻译回英文,而翻译最准确的方法便是去.po文件中查找对应的英文。
WordPress的语言包在wp-content的Languages目录中,一共有三对文件:(*为po或者mo)
1.zh_CN.* 2.admin-network-zh_CN.* 3.admin-zh_CN.* 4.continents-cities-zh_CN.*
经过查找,我发现只有zh_CN.po中包含”正在执行例行维护,请一分钟后回来。”这一个字符串,在4832行。
... #: wp-includes/load.php:189 msgid "Briefly unavailable for scheduled maintenance. Check back in a minute." msgstr "正在执行例行维护,请一分钟后回来。" ...
我们看到,这个软件语言包每一节由3段组成:
#:地址 msgid 源语言语句 msgstr 翻译后语句
看到这里,或许大家已经知道下一步是如何找对应的php代码了。没错,就是wp-include/load.php。后面那个189貌似不是行号,因为那个代码是在189行附近。。。。。。
OK,找到wp-include/load.php的189行,看到了如下代码,我大致分析了一下:
... /** * Die with a maintenance message when conditions are met. * (在维护时关闭PHP进程并显示维护信息) * * Checks for a file in the WordPress root directory named ".maintenance". * (检查在WordPress的根目录中寻找一个名为".maintenance"的文件) * This file will contain the variable $upgrading, set to the time the file * (这个文件中将会包含有一个用于记录文件创建时间的变量$upgrading) * was created. If the file was created less than 10 minutes ago, WordPress * (如果文件创建后经过的时间少于10分钟) * enters maintenance mode and displays a message. * (WordPress将进入维护模式并显示一个提示) * * The default message can be replaced by using a drop-in (maintenance.php in * (默认的消息可以被一个文件所替换) * the wp-content directory). * (此文件为maintenance.php位于wp-content目录) * * @since 3.0.0 * (来自 3.0.0) * @access private * * @global int $upgrading the unix timestamp marking when upgrading WordPress began. * (全局变量$upgrading记录着升级开始时刻的UNIX时间戳) */ function wp_maintenance() { //检测是否存在文件.maintenance,如果没有就返回. if ( ! file_exists( ABSPATH . '.maintenance' ) || wp_installing() ) return; //获取开始时间 global $upgrading; //加载.maintenance include( ABSPATH . '.maintenance' ); // If the $upgrading timestamp is older than 10 minutes, don't die. //如果$upgrading过去了10分钟,返回 if ( ( time() - $upgrading ) >= 600 ) return; //如果存在maintenance.php,引用并终止php if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) { require_once( WP_CONTENT_DIR . '/maintenance.php' ); die(); } //获取WordPress的翻译 wp_load_translations_early(); //定义返回头 $protocol = wp_get_server_protocol(); header( "$protocol 503 Service Unavailable", true, 503 ); header( 'Content-Type: text/html; charset=utf-8' ); header( 'Retry-After: 600' ); //打印那个简单的要死的提示 ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"<?php if ( is_rtl() ) echo ' dir="rtl"'; ?>> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><?php _e( 'Maintenance' ); ?></title> </head> <body> <h1><?php _e( 'Briefly unavailable for scheduled maintenance. Check back in a minute.' ); ?></h1> </body> </html> <?php die(); } ...
我们看到在这里WordPress官方做了一个十分出色的处理,官方在提示默认提示前判断了一下在WP_CONTENT_DIR目录下是否存在一个名为maintenance.php的文件,如果有这个文件,那么包含进来后结束掉PHP不再继续运行。这样处理的好处显而易见,就是能够在不动核心代码的情况下自定义维护页面。而不修改核心代码就能够保证WordPress在核心升级后不会把用户做的更改还原,从而减少了站长个性化网站的工作量。
我写了一个维护页面maintenance.php的模板,这里的几个header函数是可以省略的,不过对搜索引擎来说,省略这样的头定义会导致搜索引擎认为你网站被”取缔了”从而减少收录。
<?php $protocol = wp_get_server_protocol(); header( "$protocol 503 Service Unavailable", true, 503 ); header( 'Content-Type: text/html; charset=utf-8' ); header( 'Retry-After: 600' ); ?> <html> <head> <meta charset="utf-8"> <title>JerryZone正在维护</title> </head> <body> 提示一些东西 </body> </html>
可以在后面的html部分替换为自己希望的内容.
2016年10月4日补充:
这两天做了一个maintenance.maintenance一直扔在根目录下,用来开启wordpress的维护模式.需要开启的时候,把它改成.maintenance即可开启.为了方便关掉,开启一键访问退出维护模式,直接访问网站任意路径后加?exit即可退出维护模式.
<?php //如果发现退出指令(最好改一波exit) if(isset($_GET['exit'])) { //把自己改名为maintenance.maintenance rename(__FILE__,dirname(__FILE__).'/maintenance.maintenance'); //弹回没有请求变量的地址 header(sprintf("Location:http://%s",$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'])); //本次访问终止 die(); } //否则永远告诉wordpress我现在刚刚开始维护 $upgrading=time(); ?>
已收藏,注册时发现asd不允许注册。。
是么?我貌似并没有对这个asd做约束…可能wordpress不让吧.