2026年7月11日
2026年7月11日
WordPressのサイト移行エラーを解決する方法
はじめに
WordPressサイトを新しいサーバーやドメインに移行した後にトップページ以外が404エラーになる・管理画面のURLが旧ドメインのままでログインできない・移行後に画像やCSSが読み込まれずデザインが崩れる・プラグインの設定が消えたりシリアライズデータが壊れているといった問題は、データベース内の旧URLの残存・パーマリンクの再設定忘れ・ファイル権限の問題が原因です。
症状・原因
- 移行後にサイトにアクセスすると旧ドメインにリダイレクトされる
- 管理画面(
/wp-admin/)にアクセスすると旧サーバーのIPアドレスにリダイレクトされる - 移行後のサイトでCSSが全く読み込まれずHTMLだけが表示される
- データベースをインポートしたが「データベース接続エラー」が表示される
解決手順
ステップ1:移行後の状態を診断する
# WP-CLIでURL設定を確認
wp option get siteurl
wp option get home
# データベース内の旧URLを検索
wp eval "
global \$wpdb;
\$old_url = 'https://old-domain.com';
\$counts = [
'posts' => \$wpdb->get_var(\"SELECT COUNT(*) FROM {\$wpdb->posts} WHERE post_content LIKE '%{\$old_url}%'\"),
'postmeta' => \$wpdb->get_var(\"SELECT COUNT(*) FROM {\$wpdb->postmeta} WHERE meta_value LIKE '%{\$old_url}%'\"),
'options' => \$wpdb->get_var(\"SELECT COUNT(*) FROM {\$wpdb->options} WHERE option_value LIKE '%{\$old_url}%'\"),
'usermeta' => \$wpdb->get_var(\"SELECT COUNT(*) FROM {\$wpdb->usermeta} WHERE meta_value LIKE '%{\$old_url}%'\"),
];
foreach (\$counts as \$table => \$count) {
echo \$table . ': ' . \$count . ' rows contain old URL' . PHP_EOL;
}
"
# wp-config.phpのDB設定を確認
wp eval "
echo 'DB_HOST: ' . DB_HOST . PHP_EOL;
echo 'DB_NAME: ' . DB_NAME . PHP_EOL;
echo 'DB_USER: ' . DB_USER . PHP_EOL;
echo 'table_prefix: ' . \$GLOBALS['wpdb']->prefix . PHP_EOL;
"
ステップ2:URLを一括置換する
# wp search-replace でURLを一括置換(最重要ステップ)
# --dry-run で事前に変更件数を確認
wp search-replace 'https://old-domain.com' 'https://new-domain.com' \
--all-tables \
--skip-columns=guid \
--dry-run
# 実際に置換を実行
wp search-replace 'https://old-domain.com' 'https://new-domain.com' \
--all-tables \
--skip-columns=guid \
--report-changed-only
# HTTPからHTTPSへの変更も忘れずに
wp search-replace 'http://old-domain.com' 'https://new-domain.com' \
--all-tables \
--skip-columns=guid
# サブディレクトリから移行した場合
wp search-replace 'https://old-domain.com/blog' 'https://new-domain.com' \
--all-tables \
--skip-columns=guid
# パーマリンクを再設定
wp rewrite flush --hard
# キャッシュをクリア
wp cache flush
wp transient delete --all
# パーマリンク設定を確認
wp eval "echo get_option('permalink_structure') . PHP_EOL;"
ステップ3:データベース接続エラーを解決する
// wp-config.php: 移行先のDB設定に更新
define('DB_NAME', 'new_database_name');
define('DB_USER', 'new_db_user');
define('DB_PASSWORD', 'new_db_password');
define('DB_HOST', 'localhost'); // または移行先のDBホスト
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');
// テーブルプレフィックス(移行元と同じ値を使用)
$table_prefix = 'wp_';
// 移行先のサイトURL(wp search-replace前の緊急対応)
define('WP_HOME', 'https://new-domain.com');
define('WP_SITEURL', 'https://new-domain.com');
# データベースの文字コードを確認・修正
wp db query "SHOW VARIABLES LIKE 'character_set%';"
wp db query "SHOW VARIABLES LIKE 'collation%';"
# utf8mb4への変換(必要な場合)
wp db query "ALTER DATABASE \`$(wp eval 'echo DB_NAME;')\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# テーブルの文字コードを一括変換
wp eval "
global \$wpdb;
\$tables = \$wpdb->get_col('SHOW TABLES');
foreach (\$tables as \$table) {
\$wpdb->query(\"ALTER TABLE \`{\$table}\` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci\");
echo 'Converted: ' . \$table . PHP_EOL;
}
"
ステップ4:シリアライズデータの問題を解決する
// functions.php: シリアライズデータの修復
// ① シリアライズされたデータの確認
function check_serialized_data(string $table, string $column): void {
global $wpdb;
$rows = $wpdb->get_results("SELECT * FROM `{$table}` WHERE `{$column}` LIKE 'a:%' OR `{$column}` LIKE 's:%'", ARRAY_A);
foreach ($rows as $row) {
$value = $row[$column];
if (!@unserialize($value)) {
// シリアライズデータが壊れている
error_log("[Migration] Corrupt serialized data in {$table}.{$column}: " . substr($value, 0, 100));
}
}
}
// ② シリアライズデータ内のURLを手動修正
function fix_serialized_url(string $old_url, string $new_url, string $data): string {
// シリアライズデータでない場合はそのまま置換
if (!is_serialized($data)) {
return str_replace($old_url, $new_url, $data);
}
// アンシリアライズ → URL置換 → 再シリアライズ
$unserialized = maybe_unserialize($data);
$json = json_encode($unserialized);
$json = str_replace($old_url, $new_url, $json);
$fixed = json_decode($json, true);
return serialize($fixed);
}
# Interconnect/ITのSearch Replace DBツールを使う場合
# (シリアライズデータも安全に処理)
# php srdb.cli.php -h localhost -u dbuser -p dbpass -n dbname \
# -s 'https://old-domain.com' -r 'https://new-domain.com'
ステップ5:移行後の最終確認と最適化
# 移行後のチェックリスト
echo "=== WordPress Migration Checklist ==="
# 1. サイトURLの確認
echo "1. Site URL:"
wp option get siteurl
wp option get home
# 2. 管理者メールの確認
echo "2. Admin email:"
wp option get admin_email
# 3. パーマリンク確認
echo "3. Permalink structure:"
wp option get permalink_structure
# 4. アクティブなプラグイン確認
echo "4. Active plugins:"
wp plugin list --status=active --format=table
# 5. テーマ確認
echo "5. Active theme:"
wp theme list --status=active --format=table
# 6. コアのチェックサム確認
echo "6. Core checksums:"
wp core verify-checksums
# 7. 画像URLの確認
echo "7. Checking attachment URLs:"
wp eval "
\$uploads = wp_upload_dir();
echo 'Upload URL: ' . \$uploads['baseurl'] . PHP_EOL;
\$att = get_posts(['post_type' => 'attachment', 'numberposts' => 3]);
foreach (\$att as \$a) {
echo wp_get_attachment_url(\$a->ID) . PHP_EOL;
}
"
// functions.php: 移行後の自動修正処理
add_action('init', function(): void {
// 移行フラグが設定されている場合のみ実行
if (!get_option('_site_migrated')) {
return;
}
// キャッシュとトランジェントをクリア
wp_cache_flush();
delete_expired_transients();
// パーマリンクを再生成
flush_rewrite_rules(true);
// フラグを削除(一度だけ実行)
delete_option('_site_migrated');
error_log('[Migration] Post-migration cleanup completed at ' . current_time('mysql'));
}, 1);
注意事項
wp search-replaceを実行する前に必ず--dry-runオプションで変更件数を確認してください。特に--all-tablesオプションはプラグインのテーブルも含む全テーブルが対象になります- シリアライズされたデータ(PHPの
serialize()形式)は通常の文字列置換では壊れます。wp search-replaceはシリアライズデータを自動的に処理しますが、他のSQL直接操作ツールでは壊れる可能性があります - 移行後すぐには旧ドメインのDNSが切り替わらない場合があります(TTLによる)。DNSが完全に切り替わるまでの間、Hostsファイルを編集して新サーバーで動作確認することをお勧めします
まとめ
WordPress移行エラーの解決は①wp option get siteurl/homeでURL設定確認・posts/postmeta/optionsテーブルの旧URL件数カウント・wp-config.phpのDB接続設定確認、②wp search-replace --dry-runで変更件数確認後に--all-tables --skip-columns=guidで本番実行・HTTP→HTTPS変換も忘れずに・wp rewrite flush --hardでパーマリンク再設定、③wp-config.phpに移行先DB情報を設定・WP_HOME/WP_SITEURL定数でURL上書き・ALTER TABLE CONVERT TO CHARACTER SET utf8mb4で文字コード統一、④is_serialized()でシリアライズデータを検出・maybe_unserialize→置換→serializeの流れで安全に修正・Interconnect/IT Search Replace DBで一括処理、⑤wp core verify-checksumsでコア整合性確認・wp_upload_dir()で画像URLパス確認・_site_migratedフラグで移行後一度だけのクリーンアップ実行の手順で解決します。