2026年5月20日

2026年5月20日

WordPressのメンテナンスモード中に管理者だけログインを許可する方法

はじめに

WordPressのメンテナンスモード中でも管理者や開発者はサイトを確認したい場面があります。wp_maintenance フィルタを使えば、特定のIPアドレスや管理者ユーザーをメンテナンス画面から除外できます。

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

  • コアアップデート中:.maintenance ファイルが自動生成
  • WP-CLIで手動作成:wp maintenance-mode activate
  • プラグインで設定:Coming Soon / Maintenance Mode プラグイン等

解決手順

ステップ1:wp_maintenanceフィルタで管理者を除外する

// functions.php — メンテナンスモード中でも管理者はアクセス可能
add_filter('wp_maintenance', function($enable) {
    // ログイン済みの管理者は除外
    if (current_user_can('manage_options')) {
        return false;
    }
    return $enable;
});

ステップ2:IPアドレスで除外する

// functions.php — 特定IPアドレスをメンテナンス画面から除外
add_filter('wp_maintenance', function($enable) {
    $allowed_ips = [
        '203.0.113.10',    // 開発者の自宅IP
        '198.51.100.0/24', // オフィスのネットワーク
    ];

    $client_ip = $_SERVER['REMOTE_ADDR'] ?? '';

    foreach ($allowed_ips as $allowed_ip) {
        if (strpos($allowed_ip, '/') !== false) {
            // CIDRサブネットチェック
            [$subnet, $bits] = explode('/', $allowed_ip);
            $subnet_long = ip2long($subnet);
            $client_long = ip2long($client_ip);
            $mask        = -1 << (32 - (int)$bits);
            if (($client_long & $mask) === ($subnet_long & $mask)) {
                return false;
            }
        } elseif ($client_ip === $allowed_ip) {
            return false;
        }
    }

    return $enable;
});

ステップ3:WP-CLIでメンテナンスモードを制御する

# メンテナンスモードを有効化
wp maintenance-mode activate

# メンテナンスモードの状態を確認
wp maintenance-mode status

# メンテナンスモードを無効化
wp maintenance-mode deactivate

# .maintenance ファイルを手動で削除(緊急時)
rm /path/to/wordpress/.maintenance

ステップ4:カスタムメンテナンスページを作成する

// wp-content/maintenance.php(このファイルが存在すると自動使用される)
<?php
header('HTTP/1.1 503 Service Unavailable');
header('Retry-After: 3600');
?>
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>メンテナンス中</title></head>
<body>
<h1>メンテナンス中</h1>
<p>現在システムメンテナンスのため一時的にサービスを停止しています。<br>
しばらくしてから再度アクセスしてください。</p>
</body>
</html>

注意事項

  • wp_maintenance フィルタは wp-includes/load.php の早い段階で実行されるため、プラグインが完全にロードされる前に実行される場合があります。current_user_can() はCookieベースなので動作しますが、一部の関数は使用できません
  • .maintenance ファイルが残ったままになるとサイトが永続的にメンテナンス状態になります。アップデート失敗後はSSHやFTPで手動削除してください
  • Retry-After ヘッダーを設定することで検索エンジンが適切にクロールを延期します

まとめ

メンテナンスモード中に管理者のみアクセスを許可するには wp_maintenance フィルタで current_user_can('manage_options') を確認します。IPアドレス制御と組み合わせることで柔軟なアクセス制御が可能です。

お気軽にご相談ください

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