functions.phpでWordPressをメンテナンスモードにする方法と、.maintenanceファイルの使い方

ちょっとした修正作業のためだけに、メンテナンス用のプラグインを入れるのは避けたいこともあります。WordPressなら、functions.phpに数行追加するか、本体に備わっている仕組みを使えば、プラグインなしでもメンテナンスモードにできます。

プラグインなしでメンテナンスモードにする方法

WordPressをプラグインなしでメンテナンスモード(作業中に一般の訪問者へ「メンテナンス中」のページを表示する状態)にする方法は、主に次の3つです。

方法自分だけ通常表示にできるか管理画面向いている作業
functions.phpにコードを追加管理者としてログインしていれば通常表示使える管理画面での作業全般
.maintenanceファイルを置くできない(全員にメンテナンス画面)使えないFTPなどでファイルを直接触る作業
.htaccessを編集自分のIPアドレスを除外すれば通常表示使えるサーバー移転前後など、WordPress自体が動かない可能性がある作業

管理画面で作業するならfunctions.php、WordPressのファイルを直接差し替えるような作業なら.maintenanceが向いています。

どの方法でも、メンテナンス中はステータスコード503(サーバーが一時的に利用できない状態を表すコード)を返すようにしておきます。

503を返す理由や、Retry-After・robots.txtの扱いなど、メンテナンスモード全般の基本は「Webサイトをメンテナンスモードにする方法(.htaccess・Nginxなど)」にまとめています。

functions.phpでメンテナンスモードにする

広告

functions.phpに次のコードを追加すると、管理者としてログインしているとき以外はメンテナンス画面が表示されます。

functions.php
add_action( 'template_redirect', function () {
  // 管理者とrobots.txtは除外
  if ( current_user_can( 'manage_options' ) || is_robots() ) {
    return;
  }
  header( 'Retry-After: 3600' );
  wp_die(
    '<h1>ただいまメンテナンス中です</h1><p>9月30日 15:00ごろ再開予定です。</p>',
    'メンテナンス中',
    array( 'response' => 503 )
  );
} );

    current_user_can( 'manage_options' ) で、管理者のときは通常どおりサイトを表示できます。
    WordPressのrobots.txtは実際のファイルではなくWordPressが自動で出力しているため、is_robots() で除外します(robots.txtは503を返さないようにすることが推奨)。

    Retry-After で、再開までの目安(3600秒=1時間)を伝えています。

    wp_die() は、WordPressでエラーやメッセージの画面を表示して処理を止める関数です。これに 'response' => 503 を指定して、ステータスコードを503にしています。

    アクションフック template_redirect はサイトの表側のページを表示するときに実行される処理なので、ログイン画面や管理画面はそのまま使えます。ログアウトしてしまっても、通常どおり /wp-login.php からログインし直せます。

    広告

    ログインしているユーザー全員に見せたい場合

    管理者以外のスタッフ(編集者や投稿者)にも作業中のサイトを見せたい場合は、current_user_can( 'manage_options' ) を is_user_logged_in() に変えると、ログインしているユーザー全員が通常表示になります。

    自作のメンテナンスページを表示する

    wp_die() の画面はシンプルなデザインです。

    wp_die() を使ったメンテナンス画面

    自分で作ったHTMLを表示したい場合は、子テーマのフォルダに「maintenance.html」を作り、wp_die() の部分を次のように書き換えます。

    functions.php
    add_action( 'template_redirect', function () {
      if ( current_user_can( 'manage_options' ) || is_robots() ) {
        return;
      }
      status_header( 503 );
      header( 'Retry-After: 3600' );
      nocache_headers();
      include get_stylesheet_directory() . '/maintenance.html';
      exit;
    } );

    status_header( 503 ) で503を返し、nocache_headers() でブラウザなどにこのページをキャッシュさせないようにしています。

    .maintenanceでメンテナンスモードにする

    WordPressは、本体やテーマ、プラグインを更新している間、自動でメンテナンスモードになります。更新中にサイトを開いたときに表示される「現在メンテナンス中のため、しばらくの間ご利用いただけません。」というメッセージがそれです。

    このときWordPressは、インストールしたディレクトリに「.maintenance」というファイルを一時的に作り、このファイルがある間はメンテナンスモードになります。この仕組みを利用して、手動でメンテナンスモードにすることもできます。

    作業が終わったら.maintenanceファイルを削除します。

    設定する

    WordPressをインストールしたディレクトリ(wp-config.phpと同じ場所)に「.maintenance」というファイルを作り、次の1行を書いてFTPなどでアップロードします。

    .maintenance
    <?php $upgrading = time(); ?>

    これで標準メッセージが表示されます。ステータスコード503とRetry-After(600秒)も自動で返されます。

    WordPressは、$upgrading に書かれた時刻から10分が過ぎると、ファイルが残っていてもメンテナンスモードを自動で終了します。上のように time()(アクセスされた時点の時刻)を指定しておくと、常に「今」から数えることになるので、ファイルを削除するまでメンテナンスモードが続きます。

    決まった時刻に自動で解除する

    この「10分」の仕組みを使うと、決めた時刻にメンテナンスモードを自動で終わらせることもできます。$upgrading に「終わらせたい時刻の10分前」を書いておくと、その時刻から10分たったところでメンテナンスモードが解除されます。

    たとえば、日本時間の9月30日15:00に自動で解除したい場合は、次のように書きます。

    .maintenance
    <?php $upgrading = strtotime( '2026-09-30 15:00 +09:00' ) - 600; ?>

    strtotime() は日時の文字列を、1970年1月1日からの経過秒数(Unixタイムスタンプ)に変換するPHPの関数です。「+09:00」で日本時間であることを指定し、そこから600秒(10分)を引いています。

    Unixタイムスタンプの数字を直接書くこともできます。上と同じ日本時間の9月30日14:50は、次のようになります。

    .maintenance
    <?php $upgrading = 1790747400; ?>

    数字は、Unixタイムスタンプ 変換ツールで取得できます。

    解除されるのは、書いた時刻から10分後です。(書いた時刻そのものではない)

    解除されても.maintenanceファイルはサーバーに残るので、削除する必要があります。

    注意点

    ログインしている管理者も含めて全員にメンテナンス画面が表示され、管理画面にも入れなくなります。

    管理画面で作業したい場合には向かないので、FTPでテーマのファイルを差し替えるときなど、ファイルを直接触る作業のときに使うのがおすすめです。

    また、作業中にWordPressやプラグインの更新を行うと、更新の完了時に.maintenanceが削除されてメンテナンスモードが終わってしまいます。

    メンテナンス画面のデザインを変える

    wp-contentフォルダに「maintenance.php」というファイルを置くと、標準のメッセージの代わりにそのファイルの内容が表示されます。この場合は503やRetry-Afterが自動では送られないので、ファイルの先頭で指定しておきます。

    maintenance.php
    <?php
    http_response_code( 503 );
    header( 'Retry-After: 3600' );
    ?>
    <!DOCTYPE html>
    <html lang="ja">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>メンテナンス中</title>
      </head>
      <body>
        <h1>ただいまメンテナンス中です</h1>
        <p>しばらくしてから再度アクセスしてください。</p>
      </body>
    </html>

    maintenance.phpは、普段の本体やプラグインの更新で一時的にメンテナンスモードになるときにも使われます。置いておけば、更新中にアクセスした人にもこのページが表示されます。

    キャッシュプラグインを使っている場合の注意

    WP Super CacheやWP Fastest Cacheなど、ページをHTMLとして保存しておくキャッシュプラグインを使っていると、functions.phpの処理が動く前に保存済みのページが表示されてしまいます。そのため、コードを追加してもメンテナンス画面に切り替わらないことがあります。

    functions.phpの方法を使うときは、切り替えた直後にキャッシュを削除し、作業中はキャッシュ機能を一時的に止めておきましょう。解除したあとも、メンテナンス画面がキャッシュに残らないよう、もう一度キャッシュを削除します。

    キャッシュの扱いを気にせずに済ませたい場合は、主要なキャッシュプラグインに対応したメンテナンスモードのプラグインを使う方法もあります。

    .htaccessでメンテナンスモードにする

    レンタルサーバーなら、.htaccess(ディレクトリ単位でサーバーの動作を設定するファイル)を編集して、WordPressより手前の段階でメンテナンスページに切り替えることもできます。WordPressが動かなくなるかもしれない作業(サーバー移転やPHPのバージョン変更など)をするときは、この方法が確実です。

    WordPressの.htaccessに追加する場合は、「# BEGIN WordPress」から「# END WordPress」までの範囲より上に書くのがポイントです。この範囲はWordPressが自動で書き換えることがあるためです。

    広告

    カテゴリー : WordPress