为了防止访问者在维护过程中看到我网站的损坏版本,并让他们了解更新,我想将他们自动重定向到临时维护页面。我正在寻找一种可以在任何站点上使用而无需对URL进行硬编码的便携式解决方案。
登录的管理员(或其他选择的用户级别)应具有对后端和前端的完全访问权限。有很多提供此功能的插件,但我正在寻找仅代码解决方案。
为了防止访问者在维护过程中看到我网站的损坏版本,并让他们了解更新,我想将他们自动重定向到临时维护页面。我正在寻找一种可以在任何站点上使用而无需对URL进行硬编码的便携式解决方案。
登录的管理员(或其他选择的用户级别)应具有对后端和前端的完全访问权限。有很多提供此功能的插件,但我正在寻找仅代码解决方案。
Answers:
WordPress具有用于处理维护模式的嵌入式功能。
当您从WP仪表板升级插件或WordPress核心时,WordPress进入维护模式:它将尝试加载maintenance.php
位于内容文件夹(通常为/wp-content
)中的名为文件,如果该文件不存在,则WP显示默认消息。
我建议您使用该文件,这样您就可以对手动触发的维护和WordPress处理的维护保持一致。
首先创建maintenance.php
文件,然后将所需的内容放在此处。对于样式,我建议您使用<style>
标记将CSS放入文件本身。通常这不是一个好建议,但是在这种情况下,当没有主题加载时(主题可能正在升级,因此不可靠),它使您能够将文件用于WordPress处理的维护模式。
将刚创建的文件保存在content文件夹中(通常为/wp-content
)。
在您的内容中functions.php
:
add_action( 'wp_loaded', function() {
global $pagenow;
if(
defined( 'IN_MAINTENANCE' )
&& IN_MAINTENANCE
&& $pagenow !== 'wp-login.php'
&& ! is_user_logged_in()
) {
header( 'HTTP/1.1 Service Unavailable', true, 503 );
header( 'Content-Type: text/html; charset=utf-8' );
header( 'Retry-After: 3600' );
if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) {
require_once( WP_CONTENT_DIR . '/maintenance.php' );
}
die();
}
});
此代码将检查一个常数(请参阅下一点),如果用户未登录,请加载在点#1创建的文件并退出。
如果只允许具有特定功能的用户使用,请使用current_user_can('capability_to_allow')
代替is_user_logged_in()
。有关更多信息,请参见Codex。
也许您可以添加maintenance.php
到登录页面的链接;这样,非登录用户可以单击它,而无需在地址栏中手动输入登录URL。
如果您使用的是由第三方开发的主题,请使用子主题;这样,您将能够安全地更新主题,而不会丢失所做的更改。
当您要启用维护模式时,请打开wp_config.php
并放置以下内容:
define('IN_MAINTENANCE', true);
之后,当你准备再次使您的网站公开,只需删除该行或更改true
,以false
更容易重新启用。
define('WP_CONTENT_DIR','/url/to/define/');
在你的wp-config.php
文件中。
先前的答案是完整且写得很好。无论如何,如果您像我一样,并且希望将所有内容都放在一个位置,则可以在function.php
文件中放置以下几行,并maintenance.php
在主题目录中创建一个文件。
如果您的Git存储库仅指向主题目录,则此功能特别有用。
add_action( 'wp_loaded', function()
{
global $pagenow;
// - - - - - - - - - - - - - - - - - - - - - -
// Turn on/off you Maintenance Mode (true/false)
define('IN_MAINTENANCE', true);
// - - - - - - - - - - - - - - - - - - - - - -
if(
defined( 'IN_MAINTENANCE' )
&& IN_MAINTENANCE
&& $pagenow !== 'wp-login.php'
&& ! is_user_logged_in()
) {
header('HTTP/1.1 503 Service Temporarily Unavailable');
header( 'Content-Type: text/html; charset=utf-8' );
if ( file_exists( get_template_directory() . '/maintenance.php' ) ) {
require_once( get_template_directory() . '/maintenance.php' );
}
die();
}
});
笔记
我将标头更改为,header('HTTP/1.1 503 Service Temporarily Unavailable');
因为上面的标头对我不起作用。