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


13

为了防止访问者在维护过程中看到我网站的损坏版本,并让他们了解更新,我想将他们自动重定向到临时维护页面。我正在寻找一种可以在任何站点上使用而无需对URL进行硬编码的便携式解决方案。

登录的管理员(或其他选择的用户级别)应具有对后端和前端的完全访问权限。有很多提供此功能的插件,但我正在寻找仅代码解决方案。


从插件复制代码?
马克·卡普伦

为什么要重新发明轮子?使用插件。特别是,受限制的站点访问。
vancoder 2014年

2
我尝试为我的自定义主题使用尽可能少的插件。“少即是多”;)
NewUser 2014年

Answers:


24

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

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

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

如何

  1. 首先创建maintenance.php文件,然后将所需的内容放在此处。对于样式,我建议您使用<style>标记将CSS放入文件本身。通常这不是一个好建议,但是在这种情况下,当没有主题加载时(主题可能正在升级,因此不可靠),它使您能够将文件用于WordPress处理的维护模式。

  2. 将刚创建的文件保存在content文件夹中(通常为/wp-content)。

  3. 在您的内容中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。

    如果您使用的是由第三方开发的主题,请使用子主题;这样,您将能够安全地更新主题,而不会丢失所做的更改。

  4. 当您要启用维护模式时,请打开wp_config.php并放置以下内容:

    define('IN_MAINTENANCE', true);

    之后,当你准备再次使您的网站公开,只需删除该行或更改true,以false更容易重新启用。


这是一个非常详细的答案,也是用更少的精力解决我的问题的好方法!稍后,我将尝试并接受“答案”(如果可行)。非常感谢通用汽车!
NewUser 2014年

嗨,GM-我使用一个名为“ wp-content”的自定义目录,但我不知道如何更改WP_CONTENT_DIR ...以使其正常工作?最好
NewUser 2014年

旧线,我知道..但以防万一有人需要这个答案,它是那么容易,因为加define('WP_CONTENT_DIR','/url/to/define/');在你的wp-config.php文件中。
gmo 2015年

@gmazzap,这太神奇了。这是否意味着,并且仅当您已经登录(例如以管理员身份)时,您仍然可以访问管理控制台并在其上进行修改?
paranza

@paranza是的,正确。
gmazzap

2

先前的答案是完整且写得很好。无论如何,如果您像我一样,并且希望将所有内容都放在一个位置,则可以在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');因为上面的标头对我不起作用。


我明白了这一点,但请注意几件事-WordPress在进行自己的维护时不会在主题目录中使用此维护文件(因此,将wp-content / maintenance.php创建为一个好主意是好,然后require()将您的主题之一放进去);还可以像通常在wp-config.php中将其定义为常量或将其定义为环境变量,而不必通过进行提交来管理打开/关闭的维护模式。:)
Tim Malone

@TimMalone,我同意。最后,这是一个变通方法,在您(开发人员)进行所有更新时,该方法将在短时间内有效。
a.barbieri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.