登录

在这个站点登录

保存我的登录记录

<<忘记密码?

还没有账号?点此注册>>

Jerry

自定义WordPress临时维护页面内容

分享到:

本文已被浏览47012

用过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大学的

WordPress自定义临时维护提示信息

直接自己写一个函数,随后在动网站前把那个代码开起来。这一段代码适合于自己会写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(); ?>

 手机扫描左边的二维码,立刻将文章收入手机!
 微信扫描左边二维码,点击右上角即可分享到朋友圈!
严禁任何非授权的采集与转载,转载须经站长同意并在文章显著位置标注本文连接,站长保留追究法律责任的权利.

评论

  1. lslqtz
    #1

    已收藏,注册时发现asd不允许注册。。

    2016-05-20
    • 是么?我貌似并没有对这个asd做约束…可能wordpress不让吧.

      2016-05-20

 您需要 先登录 才可以回复.