问题描述

为了防止我的访问者在维护期间看到我的网站的破坏版本,并让他们了解更新,我想将它们自动重定向到临时维护页面。我正在寻找可以在任何网站上使用的便携式解决方案,而不需要使用硬编码的 URL 。

登录管理员 (或其他用户选择的级别) 应该可以完全访问 back-end 和 front-end 。有很多插件提供这个功能,但我正在寻找一个 code-only 解决方案。

最佳解决方案

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

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

我建议您使用该文件,这样您将保持一致的 manually-triggered 维护和 WordPress-handled 维护。

如何

  1. 首先创建 maintenance.php 文件并放置所需的内容。对于样式我建议你把 CSS 放在文件本身,使用<style> 标签; 一般这不是很好的建议,但在这种情况下,它可以让您使用文件 WordPress-handled 维护模式,当没有主题加载 (主题可能升级,所以不可靠) 。

  2. 保存刚刚在内容文件夹中创建的文件 (通常为/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' );
            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 一个登录页面的链接; 以这种方式,non-logged 用户可以点击它,而无需手动输入地址栏中的登录 URL 。

    如果您使用第三方开发的主题,请使用 child theme; 以这种方式,您将能够安全地更新主题而不会丢失您的更改。

  4. 当您要启用维护模式时,打开 wp_config.php 并将其放在:

    define('IN_MAINTENANCE', true);
    

    之后,当您准备再次公开您的网站时,只需删除该行或将 true 更改为 false,以便于更轻松的 re-enabling 。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。