2026年6月29日

2026年6月29日

WordPressをサーバー間で移行する方法【完全ガイド・データ損失ゼロ】

はじめに

WordPressのサーバー移行は正しい手順を踏めばデータ損失ゼロで完了できます。共有サーバーからVPSへの移行、ホスティング会社の変更、クラウド環境への移行まで、WP-CLIとrsyncを使った確実な移行手順を解説します。

症状・原因

  • 移行後にURLが古いサーバーのままになってしまいサイトが表示されない
  • 移行後に画像が表示されないがファイルは存在している
  • WordPressの管理画面にアクセスできずサイトが白い画面になる
  • DNS変更後もしばらく古いサーバーにアクセスされてしまい二重管理が必要

解決手順

ステップ1:移行前チェックリストの確認

移行前に現環境の情報を記録し、バックアップを取得します。

# 旧サーバーでの事前確認
# PHPバージョン
php -v

# WordPressのバージョンとプラグイン一覧
wp core version
wp plugin list --format=table
wp theme list --format=table

# データベースサイズの確認
wp db size --format=table

# アクティブなプラグイン一覧をエクスポート
wp plugin list --status=active --format=csv > /tmp/active-plugins.csv

# uploads ディレクトリのサイズ確認
du -sh /var/www/html/wp-content/uploads/

# サーバー情報の記録
echo "PHP: $(php -v | head -1)"
echo "MySQL: $(mysql --version)"
echo "Apache/Nginx: $(apache2 -v 2>/dev/null || nginx -v 2>/dev/null)"
echo "OS: $(lsb_release -d 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME)"
# フルバックアップの取得(移行前)
# DBバックアップ
wp db export /var/backups/pre-migration-db-$(date +%Y%m%d).sql

# ファイルバックアップ(wp-contentのみ)
tar -czf /var/backups/pre-migration-files-$(date +%Y%m%d).tar.gz \
    -C /var/www/html wp-content

# wp-config.phpのバックアップ
cp /var/www/html/wp-config.php /var/backups/wp-config.php.bak

echo "バックアップ完了"

ステップ2:旧サーバーでのDBエクスポートとファイルバックアップ

# 旧サーバーでの作業
OLD_PATH="/var/www/html"
EXPORT_DIR="/tmp/wp-migration"
mkdir -p "$EXPORT_DIR"

# データベースエクスポート(文字コードを明示)
wp --path="$OLD_PATH" db export \
    --add-drop-table \
    "${EXPORT_DIR}/database.sql"

# 圧縮
gzip "${EXPORT_DIR}/database.sql"
echo "DBエクスポート完了: $(du -sh ${EXPORT_DIR}/database.sql.gz)"

# wp-contentをrsyncで新サーバーに転送(DBより先にファイル転送)
# (SSHキーが設定済みであることが前提)
NEW_SERVER_IP="203.0.113.1"
NEW_SERVER_USER="deploy"
NEW_WP_PATH="/var/www/html"

rsync -avz --progress \
    --exclude="cache/" \
    "${OLD_PATH}/wp-content/" \
    "${NEW_SERVER_USER}@${NEW_SERVER_IP}:${NEW_WP_PATH}/wp-content/"

# WordPressコアファイルも転送(wp-contentとwp-config.phpは除く)
rsync -avz --progress \
    --exclude="wp-content/" \
    --exclude="wp-config.php" \
    "${OLD_PATH}/" \
    "${NEW_SERVER_USER}@${NEW_SERVER_IP}:${NEW_WP_PATH}/"

# DBエクスポートファイルを転送
scp "${EXPORT_DIR}/database.sql.gz" \
    "${NEW_SERVER_USER}@${NEW_SERVER_IP}:/tmp/"

echo "ファイル転送完了"
# SCPが使えない場合は圧縮してダウンロード
# 旧サーバーで実行
tar -czf /tmp/wordpress-backup.tar.gz \
    -C /var/www html \
    --exclude="html/wp-content/cache"

# ローカルにダウンロードしてから新サーバーにアップロード
scp old-server:/tmp/wordpress-backup.tar.gz ./
scp ./wordpress-backup.tar.gz new-server:/tmp/

ステップ3:新サーバーのセットアップとDBインポート

# 新サーバーでの作業
NEW_PATH="/var/www/html"
OLD_URL="https://example.com"   # 一時的に旧URLのまま

# WordPressコアがなければインストール
wp core download --path="$NEW_PATH" --locale=ja

# wp-config.phpを作成
wp config create \
    --path="$NEW_PATH" \
    --dbname="wordpress_new" \
    --dbuser="new_db_user" \
    --dbpass="new_db_password" \
    --dbhost="localhost" \
    --locale="ja"

# DBが存在しなければ作成
wp db create --path="$NEW_PATH"

# DBをインポート
gunzip /tmp/database.sql.gz
wp db import /tmp/database.sql --path="$NEW_PATH"

# インポート確認
wp post list --path="$NEW_PATH" --post_status=publish --format=count
wp option get siteurl --path="$NEW_PATH"

# Webサーバーの設定(Apache)
sudo chown -R www-data:www-data "$NEW_PATH"
sudo chmod -R 755 "$NEW_PATH"
sudo chmod -R 664 "$NEW_PATH/wp-content/uploads"

echo "DBインポート完了"
# Nginxの設定例(新サーバー)
sudo nano /etc/nginx/sites-available/example.com
# /etc/nginx/sites-available/example.com
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/html;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires max;
        log_not_found off;
    }
}

ステップ4:wp search-replaceでURLを更新

URLの変更をwp search-replaceで確実に行います。

NEW_PATH="/var/www/html"
OLD_URL="https://old-example.com"     # 旧URL
NEW_URL="https://example.com"          # 新URL

# ドライランで影響範囲を確認
echo "=== ドライラン実行(実際には変更しない)==="
wp search-replace "$OLD_URL" "$NEW_URL" \
    --path="$NEW_PATH" \
    --all-tables \
    --dry-run \
    --report-changed-only

# 確認後に実際に実行
echo "=== URLを実際に変換 ==="
wp search-replace "$OLD_URL" "$NEW_URL" \
    --path="$NEW_PATH" \
    --all-tables \
    --report-changed-only

# wwwなしURLも念のため変換
wp search-replace \
    "http://old-example.com" \
    "https://example.com" \
    --path="$NEW_PATH" \
    --all-tables

# IPアドレスが残っている場合の変換
OLD_IP="192.168.1.100"
wp search-replace "$OLD_IP" "$NEW_URL" \
    --path="$NEW_PATH" \
    --all-tables

# siteurl と home オプションの確認
wp option get siteurl --path="$NEW_PATH"
wp option get home --path="$NEW_PATH"

# 必要なら手動で設定
wp option update siteurl "$NEW_URL" --path="$NEW_PATH"
wp option update home "$NEW_URL" --path="$NEW_PATH"

# キャッシュとリライトをリセット
wp cache flush --path="$NEW_PATH"
wp rewrite flush --hard --path="$NEW_PATH"

ステップ5:DNS切り替え、SSL設定と移行後の確認チェックリスト

# Let's Encrypt でSSL証明書を取得(Certbot)
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

# 自動更新の確認
sudo certbot renew --dry-run

# wp-config.php に HTTPS強制を追加
wp config set FORCE_SSL_ADMIN true --path="$NEW_PATH"
# 移行後の動作確認チェックリスト
NEW_PATH="/var/www/html"

echo "=== 移行後確認チェックリスト ==="

# 1. サイトURLの確認
echo "✓ SiteURL: $(wp option get siteurl --path=$NEW_PATH)"
echo "✓ Home: $(wp option get home --path=$NEW_PATH)"

# 2. 投稿数の確認(旧サーバーと比較)
echo "✓ 公開投稿数: $(wp post list --path=$NEW_PATH --post_status=publish --format=count)"

# 3. メディアファイルの確認
UPLOADS_COUNT=$(find "$NEW_PATH/wp-content/uploads" -type f | wc -l)
echo "✓ アップロードファイル数: $UPLOADS_COUNT"

# 4. プラグインの有効化確認
wp plugin list --path="$NEW_PATH" --status=active --format=table

# 5. パーマリンクの再生成
wp rewrite flush --hard --path="$NEW_PATH"
echo "✓ パーマリンクを再生成"

# 6. データベースの最適化
wp db optimize --path="$NEW_PATH"
echo "✓ DBを最適化"

# 7. セキュリティキーの再生成(移行後は推奨)
wp config shuffle-salts --path="$NEW_PATH"
echo "✓ セキュリティキーを再生成"

echo ""
echo "=== 移行後の手動確認事項 ==="
echo "□ トップページが表示される"
echo "□ 固定ページ・投稿ページが表示される"
echo "□ 画像・メディアが表示される"
echo "□ お問い合わせフォームが動作する"
echo "□ WooCommerce(使用している場合)が正常動作する"
echo "□ HTTPSが正しくリダイレクトされる"
echo "□ 管理画面にログインできる"
echo "□ DNS伝播完了後にSSL証明書が有効になっている"
# DNS切り替えのタイミング確認
# TTLを事前に短く設定しておくことでDNS伝播を速める
# 旧DNS設定で TTL=300(5分)に変更してから24時間後に切り替える

# 伝播確認
dig +short example.com @8.8.8.8      # Google DNS
dig +short example.com @1.1.1.1      # Cloudflare DNS
nslookup example.com 208.67.222.222  # OpenDNS

注意事項

  • wp search-replaceは実行前に必ず--dry-runで影響範囲を確認してください。特にWordPressのシリアライズされたデータ(ウィジェット設定、メタデータなど)が含まれる場合は、通常のSQLのSEDやREPLACE()ではなくwp search-replaceを使うことが必須です
  • DNS切り替え後も旧サーバーを最低1週間は維持してください。DNSの伝播には最大72時間かかる場合があり、この間に旧サーバーへアクセスするユーザーへの対応が必要になることがあります
  • SSL証明書(Let's Encrypt)はDNSが新サーバーを指してから取得してください。DNS切り替え前に取得しようとすると、ドメイン検証に失敗します。DNS切り替え直後からCertbotを実行してください

まとめ

WordPressのサーバー移行は、バックアップ・ファイル転送・DBインポート・search-replace・DNS切り替えという手順を順守することでデータ損失ゼロで完了できます。移行後の確認チェックリストを使って全機能の動作を確認し、旧サーバーは一定期間維持することで安全な移行を実現しましょう。

関連記事:WP-CLIを使ったWordPress運用の自動化テクニック

お気軽にご相談ください

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