Importerデータ移管WordPressのサイトリニューアルなどで、サーバ環境ごと旧サイトから新サイトへ移行するケースがある。あるのが、サーバが老朽化したので新しいサーバに環境を移管する時とかだ。ほかに局地限定になるが、クラウド大手のAWSの例で、旧来型のParavirtual系インスタンスからモダンなHVM系インスタンスへ移管する場合に、PV2HVM変換とか面倒過ぎてHVMで環境作り直した方が早くね?とか思った時だ(リアル過ぎ...w)。移管理由は色々あれど、今回、私が経験したのが、旧サイトが1ホスト(サーバ)=1サイト(WordPress)という環境だったのに対して、新サイトはサブディレクトリ型の構造で、そのサブディレクトリの一つへサイト(WordPress)全体を移すという要件だった。サブディレクトリ内にWordPressをインストールするところまでは、何の問題もなかったのだが、いざデータ移行となって問題が発生した。今までさんざんやって来たDBデータをフルダンプした後に、新環境のDBへインポートするという手順が上手くいかなかったのだ。──そんなわけで、WordPressのインポートツールを利用しながら、データ移管を行ってみた次第。一般的なDBダンプファイルによるデータ移管まず、今回上手くいかなかったが、通常WordPressサイト間のデータ移管であれば、この方法で行うのがもっぱらなのではないだろうか。実際、私もこの方法でしかやったことがなかったし、環境を複製する場合は確実で早い。やり方は至ってシンプルで、まず、移管元DBからデータをエクスポートする。old_database_name次に、移管先DBへエクスポートデータをインポートする。dump_data.sqlそして、もしサイトのDNS(ドメイン)やWordPressインストールパスが変わる場合は、移管先DBのオプション定義値を更新する。option_name='home';これだけで、移管元と全く同じデータを持った環境ができる。今回はこの方法では上手くいかなかったので、WordPressの管理メニュー「ツール」に昔からある「エクスポート」「インポート」のツールを使ってデータ移管をしてみた。手順としては、下記のようになる。「ツール」->「エクスポート」を選択して、「すべてのコンテンツ」を選んで「エクスポートファイルをダウンロード」をクリック。XMLファイルがダウンロードされれば、エクスポート完了だ。ユーザーデータの移管WordPressのエクスポート/インポートのツールでは、ユーザーデータの移管ができない。移管先に該当するユーザーが存在しない場合、新規にユーザーが作成されるか関連付けるユーザーを選択するという仕様になっている。移管先にユーザーデータを移動する必要がないのであれば、このステップはスキップしてしまって構わない。ユーザデータも併せて移管したい場合は、それ系のプラグインを探して利用するか、その部分のみDBダンプで移管する必要がある。WordPressの公式インポートツールでは、データインポート時にインポート先のWordPressに同じユーザ(ユーザーIDと投稿名、メールアドレスが同じユーザー)がいれば、そのユーザーにデータを紐付け、いなければ新たにユーザーを作成しながらデータを移動する。複数ユーザがいるデータに対して、もし先にユーザーデータを移管せずに新規作成方式でデータインポートを行ってしまうと、移管先に作成されたユーザーのパスワードやプロフィールについて、また登録し直す運用が発生してしまう。パスワードは不可逆暗号化されてDBに保管されているため、再度個々のユーザに再設定してもらわないといけないため、コンシューマー・ユーザーを抱えているサイトでは、およそ現実的ではない。──ということで、ユーザーデータはDBダンプ形式で移管を行うことになる。TABLE文も含める)。これは、移管先にWordPressをインストールした時に作成されたルート管理者とテーブルそのものを補完するための作業だ。wp_usermetaこれで、移管先DBのユーザーデータがバックアップされた。この後、ユーザーデータ移管などに失敗した場合でも、状況を切り戻したい時には、このデータをインポートすればよい。次に、移管元のDBからユーザーテーブルとユーザーメタテーブルをデータのみ、かつinsert-ignoreオプション付きでダンプする。insert-ignoreオプションがないと、インポート先に重複するユーザ(ルート管理者)がいるためにエラーになってしまうので、それを回避させる。オプションはテーブルに含まれるデータのみをダンプするオプションだ。すべてのオプションについては、下記のページにくわしくまとめられているので、ご参考まで。オプション編そして、移管先のDBへ移管元DBのユーザーデータをインポートする。old_database_name.user_tables.ignored.sqlこれで、移管元のルート管理者以外のユーザーデータがインポートされる。移管先にルートユーザー以外に重複ユーザー(ユーザーIDが同じユーザー)がいた場合は、上書きされないので、あぶれたユーザーについては別途手動で移管するか、インポートするダンプデータを開いて該当するユーザーのユーザーIDを重複しない値に変更してからインポートする等で対応できる。移管先のWordPressにインポートツールをインストールWordPressにはインポートツールはバンドルされていないので、管理画面の「ツール」->「インポート」より「WordPress」のインポートプラグインをインストールする必要がある。一覧から「WordPress」をクリックするとプラグインダウンロード用のダイアログがポップアップするので、そこからダウンロードする。インポートプラグインを有効化して、エクスポートファイルをアップロードするインストールされたプラグインを有効化して、再度「ツール」->「インポート」より「WordPress」を選べばインポートツールが起動する。手順でエクスポートしたXMLファイルをアップロードするのだが、環境によってはアップロード最大サイズがXMLファイルより小さくてアップロードできないケースがある。いうのも、PHPのデフォルト設定ではファイルアップロードに対して2MBまでというキャップが付いているので、その場合2MB以上のXMLファイルはアップロードできないのだ。そんな場合は、PHPの設定を修正して2MB以上のファイルアップロードができるようにする。ついでにインポート処理には結構時間がかかるので、時間がかかり過ぎて処理がタイムアウトしないようにもしておけば不安がなくなる。/etc/php.iniで修正してもよいのだが、そちらでやってしまうと設定の反映にOS再起動が必要だったり、実際にはインポートの時だけ一時的にキャップが外れればよいのに、継続的に有効化されてしまって後々不都合が出てきたりするので、.htaccessに設定を入れるのが実用的だ。──ということで、.htaccessに下記のローカル設定を追加する。1440</IfModule>インポートが終わったらコメントアウトしておくなりして、必要な時以外は無効化しておくと良いかと。インポートの実行エクスポートファイルがアップロードされると、各データに関連付けられているユーザーに対して、移管先のWordPressのどのユーザーにそれを割り当てるかという設定画面が表示されるので、ここで投稿者の割り当てを変更したり、必要であればユーザーを作成する等のカスタマイズが可能だ。ユーザーが多いと、選択していくのも一苦労なのだが、すでに同名ユーザーが移管先に登録されていれば、ユーザー割り振りはしなくても、プラグインの方で自動で同一ユーザーにデータを割り振ってくれる。今回はすでにユーザーデータは移管済みなので、ユーザーの割り振りは何もすることなく、投稿に添付されている添付ファイルをインポートするかどうかだけを選んで、「実行」を押すだけでよい。インポートデータの数にもよるが、インポートが完了するまでは結構時間がかかるので、完了メッセージが出力されるまで気長に待とう。何気にメディアのインポートはすべて成功しないことがあるので、失敗したメディアについては後で手動で再登録するなり、移管元のアップロードディレクトリごと移管先に持ってくるのが確実である。.htaccessを追記していた場合、最後に追加設定を無効化しておくことを忘れないように。まとめWordPress間のデータ移管は公式のインポートツールを使うより、やはりDBダンプ型の方が簡単で確実性が高い。Importer」でユーザーデータも同時に移管できれば、かなり使い勝手のよいツールになると思う。他に公式SVNに登録されているWordPressのコアデータをユーザーデータ含めてエクスポート/インポートするようなプラグインを探してみたが、どうも目ぼしいのが見つからなかった(たぶんあるとは思うのだが...)。