2026年5月20日

2026年5月20日

WordPressのメンテナンスモード中に管理者だけログインできるようにする方法

WordPress の更新中に表示される「メンテナンス中」の画面は、ログイン画面と管理画面も含めて、すべてのアクセスを止めます。このため、テーマの functions.php やプラグインで「管理者だけは通す」設定をすることはできません。管理者だけがサイトを見たりログインしたりできる状態で作業したい場合は、自分でメンテナンス画面を出す仕組みを作るか、.maintenance ファイルに IP アドレスの判定を書きます。この記事では、標準の仕組みと、2つの方法を説明します。内容は、2026年11月時点で WordPress のソースコード(wp-includes/load.php、wp-settings.php)と WP-CLI の公式ドキュメントを確認したものです。

標準のメンテナンスモードの仕組み

WordPress の本体・プラグイン・テーマを更新するとき、WordPress は自分を置いたディレクトリに .maintenance というファイルを作り、更新が終わると削除します。中身は、作った時刻を入れた次のような PHP です。

<?php $upgrading = 1762761600; ?>

このファイルがあると、WordPress は読み込みの早い段階(wp_maintenance())で次のように動きます。

  • .maintenance を読み込み、$upgrading の時刻から10分以上たっていれば、メンテナンスモードを無視して通常どおり表示します。
  • 10分以内なら、HTTP ステータス 503 と Retry-After: 600 のヘッダーを返して処理を終えます。
  • wp-content/maintenance.php があれば、その内容を表示します。なければ、WordPress の標準のメッセージを表示します。

この判定は、プラグイン・テーマ・functions.php が読み込まれるより前に行われます。そのため、「wp_maintenance フィルター」で管理者を除外する方法は使えません(wp_maintenance は関数名で、フィルターではありません)。判定を変えられる enable_maintenance_mode フィルターはありますが、WordPress のコメントにあるとおりプラグインから使える時点より前に実行されるもので、Web 以外の実行環境向けです。また、ログイン画面(wp-login.php)も同じように止まるので、ログインして通り抜けることもできません。

更新のあとに「メンテナンス中」のまま戻らないとき

更新が途中で止まると、.maintenance が残ることがあります。中の時刻から10分たてば通常の表示に戻りますが、すぐに戻したい場合は、FTP や SSH で WordPress を置いたディレクトリの .maintenance を削除します。先頭が「.」のファイルは、FTP ソフトの設定によっては表示されないので、隠しファイルを表示する設定にして探します。

削除したあと、更新が途中だったプラグインやテーマが正しく動くかを確認し、必要なら更新をやり直します。

方法1: 管理者以外にだけメンテナンス画面を出す(自作)

時間のかかる作業で、管理者はログインしてサイトを確認しながら進めたい場合は、標準の .maintenance を使わず、自分でメンテナンス画面を出します。次のコードを wp-content/mu-plugins/simple-maintenance.php として保存します(mu-plugins ディレクトリがなければ作ります)。mu-plugins に置いたファイルは、有効化の操作なしで読み込まれます。

<?php
/**
 * Plugin Name: Simple Maintenance Mode
 * Description: 管理者以外の訪問者にメンテナンス中の画面(503)を表示する。
 */

add_action( 'template_redirect', function () {
	// 管理者(manage_options 権限を持つユーザー)は通常どおり表示する
	if ( current_user_can( 'manage_options' ) ) {
		return;
	}

	// 検索エンジンに「一時的な停止」と伝え、再訪問の目安(秒)を示す
	header( 'Retry-After: 3600' );

	wp_die(
		'<h1>メンテナンス中</h1><p>ただいまメンテナンスを行っています。しばらくしてから、もう一度アクセスしてください。</p>',
		'メンテナンス中',
		array( 'response' => 503 )
	);
} );

この方法の動きは次のとおりです。

  • template_redirect は、サイトの表側のページを表示する直前に実行されます。ログイン画面(wp-login.php)と管理画面では実行されないので、管理者はいつもどおりログインできます。
  • ログインした管理者には通常のページが表示され、それ以外の訪問者には 503 のメンテナンス画面が表示されます。
  • 編集者にも見せたい場合は、manage_options を edit_others_posts などの権限に変えます。
  • メンテナンスを終えるときは、このファイルを削除します。

注意点もあります。

  • REST API(/wp-json/)や admin-ajax.php は止まりません。表側のページだけを止める方法です。
  • ページキャッシュのプラグインや CDN を使っている場合、キャッシュ済みのページが訪問者に表示され続けることがあります。始める前と終えたあとにキャッシュを削除します。
  • 長い期間(数日以上)503 を返し続けると、検索結果に影響することがあります。メンテナンスはできるだけ短くします。

プラグインで同じことをする方法は「WP Maintenance Mode(LightStart)の設定方法」、wp-config.php の定数で切り替える方法は「WordPress のメンテナンスモードを実装する方法」で説明しています。

方法2: .maintenance に IP アドレスの判定を書く

サーバーのファイルを入れ替えるなど、プラグインを含めて WordPress 全体を止めたい作業では、標準の .maintenance を手で作る方法があります。.maintenance は PHP として読み込まれるので、IP アドレスによって $upgrading の値を変えられます。

<?php
// WordPress を置いたディレクトリの .maintenance(手作業のメンテナンス用)
$allowed_ips = array( '203.0.113.10', '198.51.100.20' ); // 作業する人の IP アドレス
$upgrading   = in_array( $_SERVER['REMOTE_ADDR'] ?? '', $allowed_ips, true ) ? 0 : time();
  • 許可した IP アドレスからのアクセスは、$upgrading が 0 になり「10分以上前」と判定されるので、通常どおり表示され、ログインもできます。
  • それ以外のアクセスは、$upgrading がアクセスした時刻になるので、10分の期限が切れず、メンテナンス画面が表示され続けます。
  • 作業を終えたら、このファイルを削除します。

この方法の注意点です。

  • 作業中に管理画面から WordPress やプラグインを更新すると、.maintenance が上書きされ、更新の終わりに削除されることがあります。更新をはさむ作業では、更新のあとにファイルがあるかを確かめ、なければ置き直します。
  • Cloudflare などの CDN やリバースプロキシを通している場合、$_SERVER['REMOTE_ADDR'] は訪問者ではなく中継サーバーの IP アドレスになります。その環境では、この方法では判定できません。
  • 自宅や会社の IP アドレスが変わると、自分も締め出されます。その場合は FTP や SSH でファイルを削除します。
  • WP-CLI の wp maintenance-mode status は、ファイルの中の数字を読み取って判定するため、この書き方では正しい状態を表示しません。

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

標準のメンテナンスモードで表示する画面は、wp-content/maintenance.php を置くと差し替えられます。WordPress はこのファイルを読み込む前に、503 のステータスと Retry-After のヘッダーを送ります。

<?php
// wp-content/maintenance.php
?>
<!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>

このファイルは WordPress の関数がほとんど使えない段階で読み込まれるので、HTML と CSS だけで作ります。方法1の自作の画面には使われません。

WP-CLI でメンテナンスモードを操作する

WP-CLI には、標準のメンテナンスモードを操作するコマンドがあります。

# 有効にする(.maintenance を作る)
wp maintenance-mode activate

# 状態を表示する
wp maintenance-mode status

# 有効なら終了コード 0、無効なら 1 を返す(シェルスクリプトの判定用)
wp maintenance-mode is-active

# 無効にする(.maintenance を削除する)
wp maintenance-mode deactivate

activate は、更新のときと同じく作った時刻を書き込んだ .maintenance を作ります。そのため、10分たつと自動的に通常の表示に戻ります。10分を超える作業には、方法1か方法2を使います。

まとめ

  • 標準のメンテナンスモード(.maintenance)は、ログイン画面も含めてすべてを止め、プラグインや functions.php より前に判定されます。10分たつと自動で解除されます。
  • 管理者だけがログインして作業できるようにするには、template_redirect で管理者以外にだけ 503 の画面を出す(方法1)か、.maintenance に IP アドレスの判定を書く(方法2)。
  • どちらの方法でも、終わったらファイルを削除し、キャッシュを消して表示を確認します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲