Skip to content

Instantly share code, notes, and snippets.

@waviaei
Last active September 1, 2023 02:54
Show Gist options
  • Select an option

  • Save waviaei/82a3eca146c24d05183c73948985d9bf to your computer and use it in GitHub Desktop.

Select an option

Save waviaei/82a3eca146c24d05183c73948985d9bf to your computer and use it in GitHub Desktop.

WordPress マルチサイトのDBの移行手順

マルチサイトはシングルサイトと場合と違い、サイトのドメインやURLに関する設定項目が wp_options 以外にもあり、また、既に子サイトが1つ以上ある場合は複数サイト分の置換を行う必要があるため躓きやすいです。

下記は、ステージング https://example.test からからプロダクション https://example.com へDBを移行する事を想定した手順書です。 逆方向やローカル環境への移行にも使えますが、その際は適切なドメインを当てはめてください。

ポイントとしては:

  • サイトネットワーク全体及び各サイト全てのドメインとURLの設定はシリアラズされていないので、SQLでピンポイントに確実に変更する。
  • ドメインとURLが設定できれば WP-CLI が正しく接続できるようになるので、シリアライズされている可能性のある残りの箇所を wp search-replace する

参考:

注意点

  • 既にマルチサイトとして構築されているサイトを環境から環境へ異動を想定としたものです。
  • 移行先には既に WordPress がインストールされてマルチサイト、HTTPSが設定済みで、問題なくアクセスとログインができることが確認されているものとします。
  • wp-config.php には必要な事が既に設定されているものとします。
  • DB以外に移行が必要なもの、特に動作に必須のテーマとプラグイン類は、既に移行先にコピー済みのものとします。

手順

Step 1: マルチサイト関連の設定テーブルを変更する

UPDATE wp_site SET domain = replace(domain, 'example.test', 'example.com');
UPDATE wp_sitemeta SET meta_value = replace(meta_value, 'https://example.test', 'https://example.com') WHERE meta_key = 'siteurl';
UPDATE wp_blogs SET domain = replace(domain, 'example.test', 'example.com');

Step 2: メインサイトのURL設定を変更する

UPDATE wp_options SET option_value = replace(option_value, 'https://example.test', 'https://example.com') WHERE option_name = 'home' OR option_name = 'siteurl';

Step 3: 各子サイトのURL設定を変更する

# サブディレクトリ型の場合
UPDATE wp_2_options SET option_value = replace(option_value, 'https://example.test', 'https://example.com') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_3_options SET option_value = replace(option_value, 'https://example.test', 'https://example.com') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_4_options SET option_value = replace(option_value, 'https://example.test', 'https://example.com') WHERE option_name = 'home' OR option_name = 'siteurl';
... (子サイト分行う)...

# サブドメイン/別ドメイン型の場合
それぞれのURLを、blog_id にマッチするもので行う。

Step 4: 残りの置換を行う

post_content 内のURL

投稿件数が多い場合はSQLで行う方が速くかつ負荷が比較的低くなります。少ないと後述の WP-CLI で纏めてやってもOK。

# サブディレクトリ型の場合
UPDATE wp_posts SET post_content = replace(post_content, '/example.test', '/example.com');
UPDATE wp_2_posts SET post_content = replace(post_content, '/example.test', '/example.com');

# サブドメイン/別ドメイン型の場合はそれぞれのテーブルに該当するドメインを指定して置換する

GUID

(シングル、マルチサイトにかかわらず)これまでプロダクションが存在したことがない新規サイトの場合で、ステージングに入稿されたコンテンツがあり、そのDBをプロダクションに移行する場合にのみ実施の検討が必要です。それ以外のケースでは基本変更は不要です。 投稿件数が多い場合はSQLで行う方が速くかつ負荷が比較的低くなります。少ないと後述の WP-CLI で纏めてやってもOK。

# サブディレクトリ型の場合
UPDATE wp_posts SET guid = replace(guid, '/example.test', '/example.com');
UPDATE wp_2_posts SET guid = replace(guid, '/example.test', '/example.com');

# サブドメイン/別ドメイン型の場合はそれぞれのテーブルに該当するドメインを指定して置換する

残り

~_options~_postmeta は特にシリアライズされている場合があるので、WP-CLI を利用する。 必ず --dry-run オプションを用いて確認を行う事。

# サブディレクトリ型の場合
# 全てのサイトで同じドメインなので --network オプションを付けてサイト全体に適用することを検討できる。例外子サイトがある場合は --url オプションを使って指定する。
wp search-replace '/example.test' '/example.com' --skip-columns=guid --network

# サブドメイン/別ドメイン型の場合
# 同じではないので、 --network は使えない。 --url オプションで1つづつ指定する。
wp search-replace '/example.test' '/example.com' --skip-columns=guid
wp search-replace '/ja.example.test' '/ja.example.com' --skip-columns=guid --url=https://ja.example.com
wp search-replace '/example2.test' '/example2.com' --skip-columns=guid --url=https://example2.com

Misc.

古いサイトを受け取る場合、DNB内、特に post_content や postmeta 内に自URLがhttp://で残っている場合があります。併せて置換することを検討する。GUIDはhttpのままで良い。

wp search-replace 'http://example.com' 'https://example.com' --skip-columns=guid

ブロックエディターで作成されたコンテンツには、HTMLのコメントアウト形式でブロック設定が保存されている他、貼り付けられたURLはエスケープ処理されている場合もあるので注意する。

https:\/\/example.com

先頭のスラッシュを除いて example.com だけでDB全体を検索すると、環境移行を目的とした置換からは外す必要がある箇所も対象としていしまうおそれがあるので注意する。例えば:

  • メールアドレス。
  • サブドメインが付いたURLに存在するリソースへのリンク。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment