WordPressのURL移行メモ

会社のWebサイトをリニューアルした。その際に一旦サブドメインrenewalにテストアップをしてからwwwに移そうと考えていたのであるが、データの移行がうまくいかなかった。

以前もWordPressの引っ越しをしたことはあるのだが、その際も一部の設定が引き継がれず個別に調整をした事を思い出した。

これまで考えていたWordPressの引っ越しの段取りとしては、
ファイルを丸ごと移行して、DBからエクスポートしたsqlファイルをエディタで開いて旧ドメインから新ドメインに一括置換して保存。その後に新しいDBにインポートという流れだと思っていた。

今回も移行できない部分だけ個別に修正しても良かったのであるが、なんだか納得いかないので移行できない原因を調査してみたという次第である。

結論から申し上げると、エディタでの一括置換や、SQL(REPLACE)での一括置換だと不具合が出るという事を学んだ。WordPress公式のツールを使う必要がある。では詳しくメモを書いていく。

 

まずうまく移行ができてない箇所がどこかを調べてみると、私の場合はフッターのテキストウィジットの部分が引き継がれていなかった。他にも何箇所か引き継がれていない部分はあったが、このフッターのテキストウィジットに注目をして調査をしてみた。

まずテキストウィジットに記述していた文字列をsqlファイルを開いて探してみるとwp_optionsテーブルのoption_name:widget_text、option_id:79に記述されている事を確認した。

エディタで開いて該当箇所を確認

 

移行前のDBをphpMyAdminで確認をしてみても、wp_optionsテーブルのoption_name:widget_textに格納されている事も確認をしたが、移行後のDBを見てみるとやはりoption_name:widget_textには正しい値が入っていなかった。

なのでエディタでの一括置換の時点で問題が起きているのだろうと思い、一括置換前と後で該当のwp_optionsテーブルのID:79あたりをみてみても問題なく置き換えが出来ているようであった。

つまり、

正常な移行前のDB

↓エクスポート

エクスポートしたsqlファイル

↓エディタで一括置換

新URLに一括置換されたsqlファイル

↓インポート

移行後のDB、異常発生(wp_optionsテーブルのoption_name:widget_textに正しい値が入らない)

上記の流れで考えた時に、一括置換後のsqlファイルに問題がないのであれば、インポート時にエラーがでているのかと思い色々と調べてみたり、それともエディタの一括置換が大丈夫そうに見えて何かまずい動作をしているのかと思いTeraPad以外のエディタで試してみても結果は変わらず、エクスポートの仕方が悪いのかと思いphpMyAdminのエクスポートの設定を変更してみたり(作成するクエリの最大長を変更したり)してみても、どうしてもうまくいかない。

 

仕方なく初心に帰ってWordPress公式のCodexを読んでみると、ヒントが書いてあった。

WordPress の引越し

ドメイン名またはURLを変更するとき

あなたがURLを変更するためにデータベース全体で検索と置換を実行すると、データシリアライゼーション(変換)で問題を引き起こすことがあります。テーマやウィジェットの中にはURLの長さを示す値を含むものがあるためです。これが変わると壊れます。

詳しい人であれば常識なのかもしれないが、上記内容についてはまったく知らなかった。ほかのWeb上で公開されているWordPressのデータ移行に関するページを見てみてもエディタやSQLでの一括置換の方法がよく書いてあるのでそれで学んだ気になってしまっていた。

解決方法としては

全データを安全に変更するため、 WordPressデータベース用検索と置換スクリプト を使用

と書いてあった。

ちなみにもっと調べてみるとCodexの英語版にはもっと詳しく書いてあった。

Moving WordPress

1.Use the Velvet Blues Update URLs plugin if you can access your WP Admin Dashboard.
2.Use the Better Search Replace plugin if you can access your WP Admin Dashboard.
3.Use WP-CLI’s search-replace if your hosting provider (or you) have installed WP-CLI.
4.Use the Search and Replace for WordPress Databases Script to safely change all instances on your old domain or path to your new one. (** only use this option if you are comfortable with database administration ** )

1,2はプラグインを使用なのであまり使いたくないし、3はWP-CLIを使う必要があるようで使った事ないので除外、4に関しては日本語版にも書いてあったのと同じ方法である。

さらに調べてみると下記のようなページもあった。Search and Replace for WordPress Databases Scriptの使い方が分かりやすく書いてある。

WordPress移行時にURLをSQLで直接一括置換はダメ! 「Search and Replace for WordPress Databases Script」を使おう

使い方に関しては上記URLに分かりやすくかかれているので割愛するが、この方法で問題なくデータ移行ができた。

注意点としては、新URLのデータを新しいDBに入れたい場合は、wp-config.phpを書き換えているかを確認してからツールを実行する。wp-config.phpを書き換えないままツールを実行すると旧DBの情報が書き換えられてしまう。旧DBの情報を残しておきたい場合は注意が必要である。

 

一括置換でのWordPressのURL変更を紹介しているページも多いのだが、彼らは大丈夫なのだろうか。

考えてみると、今回はサブドメインrenewalからwwwに移行したのでURLの長さが変わってしまったが、たまたま移行前と移行後のURLの長さが一緒だったからうまくいって、それを紹介している可能性もあるかと思う。

逆にいうと、今回のようにテストから移行する想定であれば、同じ長さのサブドメインで(例えばaaaとか)でやっていれば一括置換でも問題がなかったのかもしれない。

結構時間をとられてしまったが勉強になったのでよしとしよう。