訪問者を一時的なメンテナンスページにリダイレクトする


13

メンテナンス中に訪問者が私のサイトの壊れたバージョンを見るのを防ぎ、更新について注意を喚起するために、一時的なメンテナンスページに自動的にリダイレクトしたいと思います。URLをハードコーディングせずに、あらゆるサイトで使用できるポータブルソリューションを探しています。

ログインした管理者(または他のユーザーレベルの選択)は、バックエンドおよびフロントエンドへのフルアクセスを取得する必要があります。この機能を提供するプラグインはたくさんありますが、コードのみのソリューションを探しています。


プラグインからコードをコピーしますか?
マークカプルン14年

なぜ車輪を再発明するのですか?プラグインを使用します。具体的には、制限付きサイトアクセス。
ヴァンコーダー14年

2
私のカスタムテーマでは、できるだけ少ないプラグインを使用しようとしています。「より少ない」;)
NewUser 14年

回答:


24

WordPressには、メンテナンスモードを処理するための機能が組み込まれています。

プラグインまたはWPダッシュボードからWordPressコアをアップグレードすると、WordPressはメンテナンスモードに入ります:maintenance.phpコンテンツフォルダー(通常/wp-content)にある名前のファイルをロードしようとし、そのファイルが存在しない場合、WPはデフォルトメッセージを表示します。

このファイルを使用することをお勧めします。この方法で、手動でトリガーされるメンテナンスとWordPressで処理されるメンテナンスの一貫性を保つことができます。

方法

  1. まずmaintenance.phpファイルを作成し、そこに必要なコンテンツを配置します。スタイリングについては、<style>タグを使用してファイル自体にCSSを配置することをお勧めします。一般にこれは良いアドバイスではありませんが、この場合、テーマがロードされていない(そしてテーマがアップグレードされている可能性があるため、信頼できない)WordPressが処理するメンテナンスモードでファイルを使用することができます。

  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' );
            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()。詳細については、コーデックスを参照してください。

    maintenance.phpログインページへのリンクに追加できる場合があります。このようにして、ログに記録されていないユーザーは、アドレスバーにログインURLを手動で入力しなくてもクリックできます。

    サードパーティが開発したテーマを使用している場合は、子テーマを使用します。このようにして、変更を失うことなくテーマを安全に更新できます。

  4. メンテナンスモードを有効にする場合は、を開いてwp_config.phpそこに配置します。

    define('IN_MAINTENANCE', true);

    その後、サイトを再び公開する準備ができたら、その行を削除するか、に変更truefalseて簡単に再有効化してください。


これは非常に詳細な回答であり、できるだけ少ない労力で問題を解決するための素晴らしい方法です!後で試してみて、それが機能する場合は回答を受け入れます。GMどうもありがとう!
NEWUSER

こんにちはGM-「wp-content」ディレクトリという名前のカスタムを使用していますが、WP_CONTENT_DIR .....を変更して機能させる方法がわかりませんか?最高
NewUser 14年

古いスレッド、私は知っている..しかし、誰かがその答えを必要とする場合に備えてdefine('WP_CONTENT_DIR','/url/to/define/');wp-config.phpファイルに追加するのと同じくらい簡単です。
gmo

@gmazzap、これはすごい。(管理者として)既にログインしている場合にのみ、管理コンソールにアクセスして変更を加えることができるということですか?
-paranza

@paranzaはい、正しい。
gmazzap

2

前の答えは完全で、よく書かれています。とにかく、あなたが私のようで、すべてを1か所にまとめたい場合は、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または環境変数として配置されます。:)
ティムマローン

@TimMalone、同意します。最後に、あなた(開発者)がすべての更新を行う間、それは短期間でうまくいく回避策です。
a.barbieri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.