問題描述

為了防止我的訪問者在維護期間看到我的網站的破壞版本,並讓他們瞭解更新,我想將它們自動重定向到臨時維護頁面。我正在尋找可以在任何網站上使用的便攜式解決方案,而不需要使用硬編碼的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。