skills/wordpress-migration/EXAMPLE.md
Workspace snapshot · 09/04 13:33
実行例 / Example session
これは説明用の想定例です。実サイトの作業ログではありません。 実際の出力は環境によって変わります。この例が示したいのは、Skillが起動したときに どの順序で何を確認するかです。
例1: サーバーもドメインも変わる移行(型C)
あなた:
顧客のWordPressを old.example.com から new.example.jp へ、サーバーも変えて移行したい。
Claude(Skill起動後):
まず移行の型を確定します。ドメインとサーバーの両方が変わるので 型C です。 URL置換が必要で、DNS切替とセットになるため、当日だけでは終わりません。
先に読み取りだけの調査をします。ここでは何も変更しません。
wp core version → 6.5.2
wp option get siteurl → https://old.example.com
wp option get home → https://old.example.com
wp option get blog_public → 1
wp option get permalink_structure → /%postname%/
wp db prefix → wp_
wp db size --human-readable → 412 MB
du -sh wp-content/uploads → 6.8 GB
wp config list | grep -i WP_HOME → (なし)
判断が3つ出ました。
- uploads が 6.8GB。 ワンクリック移行プラグインは実行時間・アップロード上限に当たります。 厄介なのは失敗ではなく「途中まで成功して完了扱いになる」ことなので、rsync + wp-cli で進めます。
- DBに 412MB。 phpMyAdmin 経由のインポートは避けます。
WP_SITEURL/WP_HOME定数は未定義。置換がDBに効きます(定義済みだと「置換したのに変わらない」原因になります)。
確認させてください。
- 移行先のPHPバージョンは現行と揃えられますか(移行とPHP更新は同時にやりません。障害の切り分けができなくなります)
- コンテンツ凍結できる時間帯はいつですか(ECや会員サイトなら必須です)
- 旧ドメイン・旧IPに依存している仕組みはありますか(フォームの送信元SPF、決済のIP制限、外部cron、Webhook)
- DNSの権威はどこですか。レコードを変更できるのは誰ですか
いただけたら、次の順で日程表にします。TTL引き下げは切替の48〜72時間前、SSLの事前発行も切替前で、 どちらも当日では間に合いません。
例2: URL置換の直前(型C・置換フェーズ)
Claude:
置換に入る前に、バックアップの実体を確認します。
wp db export ~/backup/pre-replace-202608211430.sql
ls -l ~/backup/pre-replace-202608211430.sql → 431,220,544 bytes
tail -c 200 ~/backup/pre-replace-202608211430.sql → Dump completed
431MBで末尾まで書けています。復元は wp db import ~/backup/pre-replace-202608211430.sql です。
これが唯一のロールバック手段なので、控えておいてください。
次に dry-run を6形式ぶん流します。この時点でDBは一切変更されません。
wp search-replace "https://old.example.com" "https://new.example.jp" \
--all-tables-with-prefix --precise --report-changed-only --skip-columns=guid --dry-run
→ 1,284 replacements to be made(wp_posts: 902, wp_postmeta: 311, wp_options: 71)
(http:// → 214件 / //old.example.com → 38件 / JSONエスケープ形 3パス → 計 617件)
JSONエスケープ形で617件出ています。ページビルダーがJSONを入れ子で保存しているためで、 ここを飛ばすとレイアウトが後から白紙になる箇所です。
合計 2,153件を置換します。実行すると元に戻せるのは上のダンプからのみです。
このまま実行してよいですか。 承認をもらってから --dry-run を外して同じ順序で流します。
(--precise は全行をPHP側で処理してシリアライズを壊さないため、
--all-tables-with-prefix はプラグインが作った wp_ テーブルを取りこぼさないため、
--skip-columns=guid は guid を書き換えるとRSSが全記事を再配信するためです)
なお、スキーム無しの old.example.com 単体の置換は既定では行いません。
info@old.example.com のようなメールアドレスや本文中の言及まで巻き込むためです。必要ならご相談ください。
例3: 同じドメインのままサーバーだけ引っ越す(型A)
あなた:
ドメインはそのままで、サーバーだけ引っ越します。URL置換もやっておいた方がいいですか?
Claude:
やりません。 型Aなので置換は不要で、やれば事故の確率だけが上がります。
この移行で本当に気をつけるのは別のところです。
- DNS切替の前に、hosts で自端末だけ新サーバーへ向けて本番URLのまま動作確認する
- TTL経過中は旧サーバーにも到達し得るので、旧サーバー側で投稿・受注が増えないようにする
- 旧サーバーは切替後も最低でもTTL経過+7日残す(巻き戻し先が消えると復旧できません)
wp-config.phpは移行先の値で作り直す(コピーせず、DB接続情報と$table_prefixを合わせる)
置換が必要になるのは、ドメインが変わる場合(型B・C)、ステージング本番化(型D)、 HTTPS化(型E)だけです。
例4: ステージングを本番にする(型D)
Claude:
型Dで最も損失が大きく、最も気づかれにくい事故は検索避けの残存です。切替後に必ず見ます。
wp option get blog_public → 0 ← 検索避けが有効。公開なら 1 に戻す
curl -sI https://new.example.jp | grep -i x-robots-tag
X-Robots-Tag はブラウザの画面に出ないので、ヘッダーで確認します。
物理の robots.txt に Disallow: / が残っていないか、SEOプラグイン側の noindex 設定が
別にないかも見ます。ステージング用のBasic認証も外し忘れが多い箇所です。
このSkillがやらないこと
- DNSレコードの変更、サーバー契約、決済は行いません。利用者本人が実施します。
- バックアップが取れていない状態では移行を始めません。
- 破壊的コマンドは、内容と影響範囲を提示して同意を得るまで実行しません。
- 判断できない状態を「たぶん大丈夫」で通しません。懸念として明示して返します。
MIT License. Provided as-is, without warranty. Part of PENGIN Tools.