web-dev-qa-db-ja.com

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

私の訪問者がメンテナンス中に私のサイトの壊れたバージョンを見るのを防ぎ、そして彼らに最新情報を知らせないようにするために、私はそれらを一時的なメンテナンスページに自動的にリダイレクトしたいです。私は、ハードコーディングされたURLを使わずに、どのサイトでも使用できるポータブルソリューションを探しています。

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

12
NewUser

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

プラグイン、またはWordPressコアをWPダッシュボードからアップグレードすると、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()を使用してください。詳細については Codex を参照してください。

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

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

  4. メンテナンスモードを有効にしたいときは、あなたのwp_config.phpを開いてそこに置きます:

    define('IN_MAINTENANCE', true);
    

    その後、サイトを再び公開する準備が整ったら、その行を削除するか、truefalseに変更して再度有効にします。

24
gmazzap

前の答えは完全でよく書かれています。とにかく、あなたが私のようで、すべてを一箇所にまとめたいのであれば、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');に変えました。

2
a.barbieri