WordPressサイトを移転する時にはAll in One WP Migrationを使っている人が多いのではないでしょうか?
でも、大規模なサイトの場合はプラグインを使うと失敗する確率が高くなりますので、SSHを使ってファイル一式を移転する方がストレスが少ないです。
あるサイトのドメインを変更した時に今まで起きたことが無い問題が発生してかなりハマったのでメモしておきます。
メディアライブラリにファイルがアップロードされない
あるサイトのドメイン変更のために、サイトの移転を行った後に起きた事象です。
メディアライブラリにアップロードして、アップロード完了となった後にサムネイルが表示されるはずなのですが、サムネイルが表示されません。
アップロードは完了しているのでDB上はメディアが存在していることになってますが、ファイルはアップロードされていません。
移転前のサイトが残っている状態だったので念のため確認すると、移転前のサイトでは問題なくメディアライブラリにアップロードできます。
検証ツールでもエラーが無く、PHPエラーも無く、原因を調べる手がかりが無い状態でした。
プラグインを全て停止、テーマも初期テーマに変更、それでも状況変わらず。
何も変えていないのになんで?と思いながら色々検索して調べたら以下の記事を発見しました。

メディアライブラリのアップロードパスが間違っているとメディアライブラリのアップロードに失敗するという内容でした。
実際に設定⇒メディアから設定値を確認しました。
まず、絶対パスで書かれていて、その部分がドメイン変更前のサイトのままでした。
原因は確実にこれなので、これを正しいパスに変更することでメディアライブラリにアップロードできるようになりました。
メディアライブラリのアップロードパスを変更する
自分で意図的にメディアライブラリのアップロードパスを変更していないのであれば、デフォルト値に戻す方が安全です。
デフォルト値に戻すには以下の3種類の方法があります。
①ダッシュボードから変更する
設定⇒メディア と進みアップロードするファイルの保存場所が表示されていたら、以下に変更する
wp-content/uploads
②wp-config.phpに書き込んで初期状態に戻す
define( 'UPLOADS', 'wp-content/uploads' );
③wp cliを使って初期状態に戻す
wp option update upload_path 'wp-content/uploads'
なぜメディアのアップロード先が絶対パスになったのか?
アップロードするファイルの保存場所という項目は、デフォルトのwp-content/uploadsから変更していない場合は項目自体が表示されないそうです。
通常のインストールでは、最初から項目が表示されず、変更には特殊な手段が必要です。
意図的にデフォルト値から変更したことは考えられません。
しかし、私のサイトは全て絶対パスで書かれています。
なんでこのようなWordpressインストールになっているのかはわかりませんが、レンタルサーバーのWordpress簡単インストールの問題かなと思います。
ちなみにレンタルサーバーはカラフルボックスです。
なぜ移転ツールでは今回の問題が起きないのか?
今回のようなケースは初めてだったので、有名なサイト移転ツールを使っていれば問題が起きないのかもしれません。
絶対パスの中には公開ディレクトリ名だけでなくサーバー特有のパス(ユーザー名など)が含まれていますので、サーバー移転時などはドメイン名の置換だけでは上手くいかないはずです。
画像のアップロードパスに関してはデフォルト値から変更されている場合、単純な置換では置換漏れが起きそうです。
移転ツールは移転先のWordpressにインポートする際DBを書き換えるのが一般的です。DBを書き換えるのに問題が起きないのは、アップロードするファイルの保存場所のDBテーブルを書き換えないようにしているのではないかと思います。
インストール直後のWordpressはアップロードするファイルの保存場所が正しいので、そこを上書きしなければ問題が起きないからです。
All in One WP Migrationでアップロードするファイルの保存場所が変更されたサイトを移転した場合、移転先のサイトではアップロードするファイルの保存場所は初期状態(wp-content/uploads)に戻ってしまいます。
それに伴い、画像もアップロードするファイルの保存場所(wp-content/uploads)にコピー(移動ではない)されて保管されます。
結果的には辻褄が合うようになっているのですが、元の状態とは異なる状態で移転されてしまうのでかなり気持ち悪いです。
このあたりの挙動はちぐはぐになりますので、アップロードするファイルの保存場所が変更されたサイトの場合は素直にファイルとDBを直接移行した方が安全ですね。
まとめ
手動でDBをインポートしてDBテーブルを置換する場合は、隠し項目のような項目に絶対パスが残っていないか確認する必要があります。
隠し項目の設定は https://www.example.com/wp-admin/options.php で表示されます。