将访问者重定向到临时维护页面

时间:2014-11-26 作者:NewUser

为了防止我的访问者在维护期间看到我网站的损坏版本,并让他们了解更新情况,我想自动将他们重定向到临时维护页面。我正在寻找一个可移植的解决方案,可以在任何网站上使用,没有硬编码URL。

登录的管理员(或其他用户级别的选择)应该能够完全访问后端和前端。有很多插件都提供了这一功能,但我正在寻找一种只使用代码的解决方案。

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

WordPress具有处理维护模式的嵌入式功能。

当您从WP dashboard升级插件或WordPress core时,WordPress进入维护模式:它尝试加载一个名为maintenance.php 位于内容文件夹中(通常为/wp-content), 如果该文件不存在,WP将显示默认消息。

我建议您使用该文件,这样您就可以对手动触发的维护和WordPress处理的维护保持一致。

如何首先创建maintenance.php 归档并将所需内容放在那里。对于样式,我建议您将CSS放入文件本身,使用<style> 标签一般来说,这不是一个好建议,但在这种情况下,当没有加载主题(主题可能正在升级,因此不可靠)时,它可以为WordPress处理的维护模式使用文件。

保存刚刚在内容文件夹中创建的文件(通常是/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。

如果您使用的是第三方开发的主题,请使用child theme; 这样,您就可以安全地更新主题,而不会丢失所做的更改。

要启用维护模式,请打开wp_config.php 然后放在那里:

define(\'IN_MAINTENANCE\', true);
之后,当您准备再次公开站点时,只需删除该行或更改truefalse 以便于重新启用。

SO网友:a.barbieri

前面的答案很完整,写得很好。无论如何,如果你像我一样,想把所有东西都放在一个地方,你可以在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();
    }
});

NOTES

我将标题更改为header(\'HTTP/1.1 503 Service Temporarily Unavailable\'); 因为上面的那个对我不起作用。

结束

相关推荐

“自动WordPress更新无法完成-请立即重新尝试更新”--但没有.Maintenance文件

在自动升级失败后,我正在尝试手动将wordpress升级到最新版本(3.0.3)。升级后,一切正常,除了在我的管理区顶部有一条令人不快的消息:自动WordPress更新未能完成-请立即重试更新我在互联网上搜索,每个人都说这是因为.maintenance 文件位于Wordpress根文件夹中,是自动升级或手动升级失败的遗留文件。在第二种情况下,只需删除该文件,一切都会很好。但我搜索我的wordpress安装目录,没有这样的文件。知道是什么导致了这个问题吗?