コンテンツへスキップ

管理画面に入れなくなったときの緊急復旧 — WP-CLI が `wp-login.php` を経由しない理由

パスワードを忘れた、セキュリティプラグインが自分の IP を誤ってブロックした、不具合のあるプラグインが管理画面を真っ白にした——理由はさまざまでも、結果は同じ「管理画面にログインできない」という状態に陥ることがある。

補足: WP-CLI は WordPress を操作するコマンドラインツール。wp というコマンド名で、ブラウザを介さずサーバー上から直接 WordPress を操作する。

このとき焦って復旧を急ぐと判断を誤りやすい。WP-CLI がこの状況で機能するのは、ログイン画面(wp-login.php)を経由せずデータベースとファイルシステムに直接アクセスするためで、管理画面そのものが壊れていても影響を受けない。

なぜ管理画面が壊れていても WP-CLI は動くのか

通常のログインは「ブラウザ → wp-login.php → 認証処理 → 管理画面」という経路を通る。この経路上のどこか一箇所でも壊れていれば(認証処理がプラグインのバグで例外を投げる、セキュリティプラグインが IP 単位でブロックする、管理画面のテーマ側に致命的エラーがある等)、ログインそのものが成立しない。

WP-CLI は SSH 接続でサーバーに入り、WordPress のデータベース(wp_users テーブルや wp_options テーブル)とファイルシステムに直接アクセスする。wp-login.php のコードはまったく経由しないため、ログイン処理側に問題があっても影響を受けない。SSH 接続自体ができることが前提になるが、レンタルサーバーであれば管理画面とは独立した経路で SSH が提供されていることが多い。

シナリオ 1: パスワードを忘れた

# 管理者ユーザーの一覧を確認する
wp user list --role=administrator --fields=ID,user_login,user_email

# パスワードを直接上書きする
wp user update 1 --user_pass='新しい強固なパスワード'

wp user update はメール送信やトークン発行を介さず、データベースの該当行を直接書き換える。パスワードリセットメールが届かない・スパムフォルダに入る、といった経路の不確実性が発生しない。

シナリオ 2: セキュリティプラグインが自分の IP をブロックした

ログイン試行回数制限プラグインが、本人の作業中の通信を誤って攻撃と判定し、自分の IP をブロックリストに入れてしまうことがある。

# 該当プラグインを一時的に無効化する
wp plugin deactivate <ロックの原因になっているプラグイン名>

# 復旧後、設定を見直してから再度有効化する
wp plugin activate <プラグイン名>

プラグインを無効化すると、そのプラグインが保持していたブロックリストや制限ロジックも合わせて無効になる。原因が分からない場合は、まず全プラグインを止めて状況を切り分ける。

# 全プラグインを一時停止する(原因の切り分け用)
wp plugin deactivate --all

# 管理画面にログインできることを確認した後、1つずつ戻す
wp plugin activate <プラグインA>
wp plugin activate <プラグインB>

1 件ずつ有効化しながら都度ログイン確認することで、どのプラグインが原因だったかを特定できる。

シナリオ 3: 管理者ユーザーが存在しない・全員ロックされた

退職者のアカウント削除作業の誤りなどで、管理者権限を持つユーザーが誰も存在しない状態になることもある。

# 新しい管理者ユーザーを作成する
wp user create rescue_admin admin@example.com --role=administrator --user_pass='強固なパスワード'

wp user create はメール認証やプラグインの承認フローを介さず、即座に管理者権限を持つユーザーを作成する。復旧後は、緊急用に作成したこのアカウントを削除するか、必要最小限の権限に戻しておく。

シナリオ 4: 管理画面が真っ白(プラグインの致命的エラー)

PHP の致命的エラーで管理画面が真っ白になる場合、原因のプラグインを無効化すれば直る場合が多い。

# エラーログから直前に発生したプラグインのエラーを特定した上で
wp plugin deactivate <原因プラグイン名>

WP-CLI 自体がプラグインの読み込みでクラッシュして動かない場合は、--skip-plugins --skip-themes で WP-CLI を起動する方法が先に必要になる。WP-CLI が動いてからでないと、ここで紹介したコマンドはどれも実行できない。

復旧後に必ず確認すること

# 緊急用に作成したユーザーが残っていないか確認する
wp user list --role=administrator --fields=ID,user_login,user_email

# 停止したままのプラグインがないか確認する
wp plugin list --status=inactive

緊急対応で作成したユーザーやパスワードは、復旧が完了した時点で削除・変更する。応急処置のまま放置すると、それ自体が次のセキュリティリスクになる。

まとめ

状況 使うコマンド
パスワードを忘れた wp user update <ID> --user_pass=...
セキュリティプラグインの自己ブロック wp plugin deactivate <name> / --all
管理者が誰もいない wp user create ... --role=administrator
プラグインのエラーで画面が真っ白 wp plugin deactivate <name>
WP-CLI 自体が起動しない --skip-plugins --skip-themes

どのシナリオでも共通しているのは、WP-CLI が wp-login.php を経由せず WordPress のデータベースに直接アクセスしているという一点に尽きる。s:N: のバイト数不整合に注意が必要なシリアライズ値の置換と同様に、WP-CLI は管理画面より一段低いレイヤーで WordPress を操作する手段であり、それが緊急復旧の場面で効いてくる。