2026年5月20日

2026年5月20日

WordPressを別のサーバーに移行する方法(All-in-One WP Migration・WP-CLI)

WordPress のサイトは、ファイル(WordPress 本体、wp-content の中のテーマ・プラグイン・アップロードした画像、wp-config.php、.htaccess)と、データベース(投稿・設定・ユーザーなど)でできています。サーバーの移行では、この両方を新しいサーバーへ移し、新しいデータベースの接続情報を設定し、最後に DNS を切り替えます。ドメインが変わる場合は、データベースの中の URL も置き換えます。

この記事では、プラグインで移す方法と、WP-CLI を使って手動で移す方法を説明します。コマンドは Ubuntu/Debian の例です(RHEL 系では Web サーバーのユーザー名などが異なります)。

移行の流れ

  1. 移行元と移行先の環境を確認し、DNS の TTL を短くしておく
  2. 移行元でファイルとデータベースを書き出す
  3. 移行先に取り込み、接続情報を設定する
  4. 自分の PC の hosts ファイルで、DNS を切り替える前に移行先を確認する
  5. DNS を切り替え、SSL 証明書を用意する
  6. 旧サーバーへのアクセスが無くなるのを待ってから停止する

ステップ1:移行前の準備

環境を確かめる

移行元で次の値を確認し、移行先が同じかそれ以上のバージョンを満たすようにします。PHP のバージョンが変わる場合は、テーマやプラグインが新しい PHP に対応しているかも確認します。

cd /var/www/html          # WordPress を置いているディレクトリ
wp core version
wp eval 'echo PHP_VERSION, PHP_EOL;'
wp db query 'SELECT VERSION();'
wp db size --human-readable
du -sh wp-content/uploads
wp plugin list

wp eval で表示されるのは WP-CLI が使う PHP のバージョンです。Web サーバーが使う PHP と違うことがあるので、管理画面の「ツール」→「サイトヘルス」→「情報」でも確認してください。

DNS の TTL を短くする

DNS を切り替えたあと、古い IP アドレスは TTL(キャッシュしてよい時間)の間、各地の DNS サーバーに残ります。移行の前に、Web サイトの A レコードの TTL を300秒(5分)程度に下げておきます。下げた設定が行き渡るには元の TTL の時間がかかるので、元の TTL が1日なら1日以上前に下げます。

# 今の TTL を確認する(2列目の数字が TTL)
dig example.com A +noall +answer

移行中の更新を止める

書き出してから DNS が切り替わるまでの間に、旧サーバーで投稿・コメント・注文などがあると、その分は新サーバーに入りません。作業する時間帯を決め、その間は更新を控えます。コメントや注文を受け付けているサイトでは、移行作業の時間を事前に告知するとよいでしょう。

方法A:All-in-One WP Migration で移す

ファイルとデータベースをまとめて1つの .wpress ファイルにし、移行先で取り込むプラグインです。サイトが小さく、SSH が使えない場合に向いています。

  1. 移行元にプラグインを入れ、「All-in-One WP Migration」→「エクスポート」で書き出し先にファイルを選び、.wpress ファイルをダウンロードします。
  2. 移行先に WordPress を新しくインストールし、同じプラグインを入れます。
  3. 移行先で「All-in-One WP Migration」→「インポート」を開き、.wpress ファイルをアップロードします。

注意点:

  • 取り込めるファイルの大きさは、サーバーのアップロードの上限で決まり、インポート画面に表示されます。上限を超える場合は、サーバーの PHP の設定(upload_max_filesize など)を上げるか、有料の Unlimited Extension を使うか、方法Bで移します。
  • 取り込むと、移行先のデータベースとファイルは書き出したサイトの内容で置き換わります。ユーザーも置き換わるので、取り込んだあとは移行元のユーザー名とパスワードでログインします。
  • 取り込んだあとは「設定」→「パーマリンク」を開いて「変更を保存」を押し、パーマリンクの設定を作り直します。

方法B:WP-CLI と tar で手動で移す

SSH と WP-CLI が使える場合は、この方法が大きなサイトでも確実です。WP-CLI の使い方は WP-CLIのデータベース操作 も参考にしてください。

移行元での作業

cd /var/www/html

# データベースを書き出す
wp db export /tmp/site.sql

# WordPress のディレクトリを丸ごとまとめる(.htaccess と wp-config.php も含まれる)
# --exclude は対象(最後の ".")より前に書く
tar -czf /tmp/site-files.tar.gz -C /var/www/html \
  --exclude=./wp-content/cache \
  .

# 移行先へ送る
scp /tmp/site.sql /tmp/site-files.tar.gz user@new-server:/tmp/

キャッシュのディレクトリは移行先で作り直されるので除外しています。バックアップ用プラグインが wp-content の中にバックアップを溜めている場合は、そのディレクトリも除外すると転送が速くなります。

書き出したファイルにはデータベースの内容とパスワードが入っています。転送が終わったら移行元の /tmp から消してください。

移行先での作業

まずデータベースとユーザーを作ります(MySQL 8.0/MariaDB の例)。

sudo mysql
CREATE DATABASE wp_new CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_new_user'@'localhost' IDENTIFIED BY '長く推測されにくいパスワード';
GRANT ALL PRIVILEGES ON wp_new.* TO 'wp_new_user'@'localhost';
FLUSH PRIVILEGES;

次にファイルを展開し、接続情報を書き換えて、データベースを取り込みます。

sudo mkdir -p /var/www/html
sudo tar -xzf /tmp/site-files.tar.gz -C /var/www/html
sudo chown -R www-data:www-data /var/www/html
cd /var/www/html

# wp-config.php の接続情報を移行先の値に変える
sudo -u www-data wp config set DB_NAME wp_new
sudo -u www-data wp config set DB_USER wp_new_user
sudo -u www-data wp config set DB_PASSWORD '長く推測されにくいパスワード'
sudo -u www-data wp config set DB_HOST localhost

# データベースを取り込む
sudo -u www-data wp db import /tmp/site.sql

# サイトの URL を確認する
sudo -u www-data wp option get home
sudo -u www-data wp option get siteurl

wp db import は、移行元のテーブル接頭辞($table_prefix)のまま取り込みます。wp-config.php を移行元から持ってきているので、接頭辞はそのまま一致します。取り込みが終わったら /tmp の SQL ファイルは消してください。

ファイルの権限は、ディレクトリを755、ファイルを644にするのが一般的です。wp-config.php は、Web サーバーのユーザーが読めることを確かめたうえで640などに絞ります。

sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
sudo chmod 640 /var/www/html/wp-config.php

Web サーバー(Apache の VirtualHost や Nginx の server ブロック)の設定は、移行元を参考に作ります。Nginx では .htaccess は使われないので、パーマリンク用の try_files などを server ブロックに書く必要があります。

ドメインが変わる場合:URL を置き換える

同じドメインのままサーバーだけを変える場合、この作業は要りません。

ドメインが変わる場合は、データベースの中の URL をまとめて置き換えます。wp search-replace は、WordPress やプラグインがシリアライズ(PHP の形式で保存)したデータも壊さずに置き換えます。先に --dry-run で件数を確かめ、データベースのバックアップを取ってから実行します。

# 変更される件数を確認する(データベースは変わらない)
sudo -u www-data wp search-replace 'https://old-example.com' 'https://new-example.com' \
  --skip-columns=guid --dry-run

# 問題なければ実行する
sudo -u www-data wp search-replace 'https://old-example.com' 'https://new-example.com' \
  --skip-columns=guid --report-changed-only
  • guid 列は投稿を識別するための値で、RSS リーダーなどが記事の重複判定に使います。URL が変わっても書き換えません(WP-CLI の公式の例も --skip-columns=guid を付けています)。
  • http:// で始まる古い URL が残っている場合は、http://old-example.com についても同じように置き換えます。
  • 接頭辞が WordPress の標準と違うプラグイン独自のテーブルも対象にするには、--all-tables-with-prefix を付けます。

置き換えのあと、旧ドメインへのアクセスを新ドメインへ301で転送します。旧ドメインを受けるサーバーの .htaccess の例です(Apache の mod_rewrite を使います)。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?old-example\.com$ [NC]
RewriteRule ^(.*)$ https://new-example.com/$1 [R=301,L]

Google Search Console を使っている場合は、新しいドメインのプロパティを登録し、アドレス変更ツールで移転を知らせます。

ステップ2:DNS を切り替える前に hosts ファイルで確かめる

DNS を切り替える前に、自分の PC だけが移行先のサーバーを見るようにして確認します。PC の hosts ファイルに、移行先の IP アドレスとドメインを1行書きます(サーバーの /etc/hosts ではありません)。

OS hosts ファイルの場所
Windows C:\Windows\System32\drivers\etc\hosts(メモ帳を管理者として実行して編集)
macOS/Linux /etc/hosts(sudo で編集)
203.0.113.50  example.com www.example.com

203.0.113.50 は移行先の IP アドレスの例です。移行先の IP は、移行先のサーバーで ip -4 addr を実行するか、サーバー会社の管理画面で確認します。

ブラウザーでトップページ、個別の記事、画像、管理画面へのログイン、問い合わせフォームなどを確かめます。移行先にまだ SSL 証明書が無い場合は、HTTPS で開くと証明書の警告が出ます。確認が終わったら hosts ファイルの行を消してください。

ステップ3:DNS を切り替えて SSL 証明書を用意する

DNS の管理画面で、A レコード(example.com と www、IPv6 を使っていれば AAAA レコードも)を移行先の IP アドレスに変え、切り替わったかを確かめます。

dig +short example.com A
dig +short example.com A @8.8.8.8

Let's Encrypt の証明書は、ドメインが移行先を指すようになってから取得します(HTTP-01 の認証は、そのドメインにアクセスして確かめるため)。Nginx の場合の例です。

sudo certbot --nginx -d example.com -d www.example.com

Apache では --nginx を --apache に変えます。詳しくは Certbotで NginxにSSLを設定する方法 を参照してください。DNS の切り替え前に証明書が必要な場合は、DNS-01 方式で取得するか、移行元の証明書を一時的に使います。

ステップ4:移行後の確認

cd /var/www/html
sudo -u www-data wp core verify-checksums
sudo -u www-data wp plugin status
sudo -u www-data wp cache flush
curl -sI https://example.com/ | head -1
  • パーマリンク: 記事ページが404になる場合は、管理画面の「設定」→「パーマリンク」で「変更を保存」を押します。Apache で mod_rewrite が有効か、VirtualHost で AllowOverride が許可されているかも確認します(移行後の404エラーの直し方)。WP-CLI の wp rewrite flush --hard で .htaccess まで書き直すには、wp-cli.yml の apache_modules に mod_rewrite を書いておく必要があります。
  • メール: 移行先のサーバーからメールが送れるか、問い合わせフォームやパスワードの再設定で確かめます。
  • WP-Cron: 予約投稿や定期処理が動くか確かめます。移行元でサーバーの cron から wp-cron.php を呼んでいた場合は、移行先にも同じ設定を作ります。
  • キャッシュ: キャッシュプラグインや CDN のキャッシュを削除します。

ステップ5:旧サーバーを止める

DNS を切り替えても、TTL の間は旧サーバーへのアクセスが続きます。旧サーバーのアクセスログを見て、訪問者からのアクセスが来なくなったことを確かめてから停止します。

# 旧サーバーで、最近のアクセスを確認する(Nginx の例)
sudo tail -f /var/log/nginx/access.log

旧サーバーを解約する前に、最新のバックアップ(ファイルとデータベース)を手元に残しておきます。

まとめ

  • 移行するのはファイルとデータベースの2つです。DNS の TTL は事前に短くしておきます。
  • 小さなサイトは All-in-One WP Migration、SSH が使えるなら wp db export と tar で丸ごと移す方法が確実です。
  • ドメインが変わるときだけ wp search-replace を --dry-run で確かめてから実行し、guid は書き換えません。
  • DNS を切り替える前に、PC の hosts ファイルで移行先を確認します。証明書は切り替え後に取得します。
  • 旧サーバーは、アクセスが無くなったのを確かめてから止めます。

お気軽にご相談ください

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