コンテンツへスキップ

壊れた 1 件だけを戻す — WP-CLI で per-plugin rollback を実装する

プラグイン 20 件をまとめて更新して、そのうちの 1 件がサイトを壊した。多くの WordPress 保守ツールでは、こういうとき安全側に倒して 20 件すべてを元に戻す設計(”Safe Updates” / “Atomic Updates” などと呼ばれる)が一般的です。

ただ運用していると、「壊れた 1 件だけを戻して、残り 19 件は更新を維持したい」場面が増えてきます。今回はその設計を WP-CLI ベースでどう組み立てるか、実装側の話をまとめておきます。

起点になるコマンド — wp plugin install --version=X --force

WP-CLI には、プラグインを「特定のバージョンで上書きインストール」する強力なコマンドがあります。

wp plugin install <plugin-slug> --version=1.2.3 --force --skip-plugins --skip-themes

オプションの意味は:

  • --version=1.2.3 — 上書きする旧バージョンを指定(WP.org の公開バージョンならどれでも)
  • --force — 既に同名プラグインが存在しても上書きする
  • --skip-plugins --skip-themes — WP-CLI 起動時のプラグイン/テーマロードをスキップ(壊れたプラグインがある状態でも WP-CLI 自身が落ちない。詳細は別記事

このコマンド 1 行で「プラグインを旧版にピンポイントで巻き戻す」が実現できます。あとはこれを 更新フローのどこで・どんな条件で叩くかの設計次第です。

HTTP チェックと組み合わせる

ステップごとに HTTP ステータスを取り、変化を検知する:

プラグイン更新前: GET / → 200
↓
wp plugin update <plugin-slug> --skip-plugins --skip-themes
↓
プラグイン更新後: GET / → 500 ← 壊れた!
↓
wp plugin install <plugin-slug> --version=<旧版> --force --skip-plugins --skip-themes
↓
ロールバック後: GET / → 200 ← 復旧
↓
次のプラグインへ進む

更新の単位を「全部まとめて」ではなく「1 件ずつ + HTTP チェック」にすることで、どのプラグインで壊れたかが明確になります。

ロールバック対象の特定

「直前に更新したプラグイン」がそのまま犯人候補です。これは bulk update では成立しません(複数同時更新だと、HTTP が 500 を返したときどのプラグインが原因か絞り込めない)。

1 件ずつ更新する設計の利点は、HTTP が変化した瞬間のプラグインが、即座に巻き戻し対象として確定することです。誤って関係ないプラグインまで戻すリスクがない。

旧バージョンの値は「更新前」のスナップショットから取れます:

# 更新前に控えておく
wp plugin list --format=json --skip-plugins --skip-themes > /tmp/plugins_before.json

# ロールバック対象のスラグから旧版を引く
prev_version=$(jq -r '.[] | select(.name=="<slug>") | .version' /tmp/plugins_before.json)

これでスナップショットから旧版を引いて巻き戻し、検証して問題なければ次のプラグインへ進む、というループが成立します。

復旧確認 — 戻したら必ず HTTP を再チェック

ロールバック後にもう一度 HTTP を取り、200 に戻っているかを確認します:

  • ✅ 200 に戻った → そのプラグインだけ更新を諦め、次のプラグインへ
  • ❌ まだ 500 → ロールバックでは復旧できない(壊れた状態が PHAR バイナリ自体ではなく、DB スキーマや別ファイルに残っている等)→ より重い処理(DB 全体ロールバック・キャッシュフラッシュ・テーマ自動切替など)へエスカレーション

この段で「巻き戻したら確実に直る」と思い込まず、戻した直後にもう一度確認するのがポイント。--force での上書きインストールはファイル置換しか行わないため、DB 側の不整合は別途検出が必要です。

まとめ — 「全体を戻す」と「1 件だけ戻す」の選択

業界主流の「全部まとめて戻す」設計は実装が単純で安全側に倒れる利点があり、選ばれる理由はちゃんとあります。一方で「壊れた 1 件だけを戻す」設計は、運用視点では:

  • 壊した犯人がログに直接残る
  • 安全に終わったプラグインの更新は維持される
  • 次回の保守タスクで巻き戻し分だけ再試行できる

という利点があります。実装側の手間と引き換えに、運用の透明性と継続性が上がる、というトレードオフ。

WP-CLI の --version=X --force という小さなコマンドが、この設計を支えています。SSH と WP-CLI が使えるレンタルサーバーでの保守自動化を考えている方には、ぜひ覚えておいてほしいフラグの組合せです。

業界全体がこの per-plugin rollback を採用していない構造的背景は、業界 4 社調査の 3 つの未解決領域 も併せてどうぞ。