MT->WP Log. (WordPress引っ越し記録)
先日、MovableTypeからWordPressに移行したので作業記録を残す。
このエントリは移行時の作業メモであり、MovableTypeからWordpressへの移行作業を1から10まで書いていない。 また、本ブログで重要とされてる事柄(主にパーマネントリンク)に対して、本ブログなりの対策を行っているため、全ての方の参考にはならないかもしれない。 つまり『移行ガイド』ではないのでそのつもりで。
環境は以下のとおり。
- OS:CentOS
- PHP:5.1.6-24
- MySQL:5.0.77
- MovableType:4.27-ja (以降 MT )
- WordPress:2.9.2-ja (以降 WP )
■パーマネントリンクの解決
最大の課題。
完全に移行(MTエントリのURLでWPのエントリにリンクさせる)するか、それとも潔くMTのパーマネントリンクは捨てるか。
本ブログは移行時点で約400のエントリを持っていて、どちらかと言えばエントリの少ないブログに区分されると思う。
しかし、ありがたくもソーシャルブックマークされているものや、中には検索エンジンの上位に検出されるエントリも存在するため、それらを完全に無視するのも申し訳ない。
かと言って、MTでのURLをWPにマッピングして将来的にもMTのならわしでWPを運用し続けていくのも気に食わない。
結論として、外部サイトからリンクを張られた(リンク切れが発生する)エントリに関しては、apacheのmod_rewriteによりWPにマッピングし、他のエントリに関してはMTのURLを捨てる事とした。
今後のパーマネントリンクはWPの形式に準ずる事にする。
■mod_rewriteの実験
実現したい事は、MTのURLでアクセスしても、移行後のWPエントリが表示される事。 mod_rewriteは正規表現を用いる事ができる等、自由度高く動作指定できるのだけど、期待する動作は1:1の紐付けと、古いURLでアクセスした際に301を返却させる事である。
全ての設定(RewriteRule)をWPの.htaccessファイルに記述すれば実現するが、httpd.confに記述した方が動作が速くなるそうなのでそうする。
実験的にWPインストール&MTからのインポートを行い、ちゃんとrewriteされるか色々と試したところ、最初はうまくいかなかった。以下の理由で。
- rewrite設定を記述しても、アクセスしたファイル(つまりrewrite元のファイル)が存在する場合にはrewriteしない。
- 該当フォルダに.htaccessファイルが存在し、rewriteの記述が存在する場合にはOverwriteされてしまい(本当?)、httpd.confの記述が有効とならない。
この事から、前者については移行後は該当しないので問題ないが、後者についてはWPが元々持っている.htaccessファイルが存在する(パーマネントリンクの設定をdefault以外にした場合)ため対策しなくてはならない。
対策は、WPの.htaccessファイルの内容をhttpd.confに移動させ、.htaccessの中身は無効化(記述削除でもいい)する。
ちなみに、WPの(.htaccessに自動生成された)rewrite設定は、今回のrewriteマッピング設定よりも後ろに記述する事。そうしないと、全てのアクセスがWPのindex.phpにrewriteされてしまう。不安であれば移行前に色々と実験した方が良い。
なお、.htaccessの中身をコメントアウトないしファイルそのものを削除して.htaccessの中身を無効としても、後でWPの管理画面よりパーマリンクの設定を更新すると、.htaccessの内容は復活してしまう。
これにより、いつのまにかmod_rewriteで設定した内容が無効になってしまうので、パーマリンクの設定は以後行わないようにするか、.htaccessをapacheが更新できないよう、ファイルそのもののパーミッションを変更しておく必要がある。これはハマった。
それでは実際の移行作業に移ろう。
■DataBaseの作成
以下の説明では、MySQLのユーザ名をUSER_NAME、パスワードをPASSWD、WPで用いるデータベース名をDATABASE_NAMEとしている。
$ unzip wordpress-2.9.2-ja.zip
Archive: wordpress-2.9.2-ja.zip
creating: wordpress/
creating: wordpress/wp-includes/
:
apacheに書き込み権限を与える。
なお、私のアカウントはapacheグループに所属しているため、一般ユーザでchgrp apacheが可能となっている。できなければrootで実施する事。
$ chgrp apache ./wordpress/
$ chgrp apache ./wordpress/wp-content
$ chmod g+w ./wordpress/
$ chmod g+w ./wordpress/wp-content
なお、MTとWPを同一フォルダに共存させるため、WPの方はとりあえず「wp_blog」というフォルダ名としておく。
以上、ディレクトリに適切な権限が付与されていれば、あとはブラウザから設定する事ができる。
ブラウザから、データベース名等設定する。セキュリティ上不安であればSSL(https://)で接続する。 面倒ならsshで接続して直にconfigファイルを編集したり、ローカルで編集したconfigファイルをFTPでアップロードしても良い(WordPress自体がこの方法を推奨している)。
設定が完了すればadminというユーザが生成され、ブラウザに初期パスワードが表示される。これをメモしておく。
ログインボタンを押下する。
アカウントをadminとし、パスワードは先ほどメモしたものを入力する。
WPのダッシュボードが表示される。
まずは新規アカウントの生成(adminを使い続けても良いのだが気持ちが悪い)。
管理者権限を与える。
adminをログアウトし、新たに生成したアカウントでログイン。
adminをコンテンツごと削除する(『すべての投稿とリンクを削除』を選択)。
これで何もない(まっさらな)WPができあがる。
■WPへのインポート
MTからエクスポートしたファイルをインポートする。
当ブログは、エントリ数が少ないのでエクスポートファイルが2MB以内に収まったが、2MBを超える場合には、ファイル名をmt-export.txtとし、/wp-content/に格納してからブラウザを操作する。
要するにインポートページに書いてあるようにする。
■投稿者の割り当て
インポートするエントリの投稿者をWPのユーザに割り当てる。先ほど生成したユーザ(つまり今ログインしている唯一のユーザ)に割り当てる。
■パーマリンクの設定
[設定]→[パーマリンク設定]
『カスタム構造』を選択し、以下を指定した。
/%year%/%monthnum%/%post_id%
■Rewriteの設定
いよいよ。
■Movabletypeからデータのエクスポート
メニュー:[ツール]→[エクスポート]で、『ブログをエクスポート』ボタンを押下。
画像などのバイナリデータは含まれていないので、MTの環境はまだ捨ててはならない。
■外部サイトからのリンク抽出
この作業はGoogleのウェブマスター ツールが適している。
ダッシュボードの『サイトへのリンク』から詳細ページに遷移すると、リンク情報をcsv形式のファイルでダウンロードする事ができる。
ブログへのリンクのみを抽出するためにスクリプトを書いた。
スクリプトは失われました。すみません。
もしも、あなたがこのスクリプトを利用する場合には、strstrの引数を修正する必要がある。
スクリプトは以下のように用いる。Gg_BlogLink.txtに抽出されたURLが記録される。
$ php BlogLinkExtract.php ダウンロードしたCSVファイル名 > Gg_BlogLink.txt
■WordPressのURLとエントリタイトルの取得
MTからインポートしたエントリをエクスポートする(WPでのURLが欲しいので)。
以下のスクリプトを書いた。このスクリプトを実行すると、WPのURLとそれぞれのエントリタイトルが得られる。
スクリプトは失われました。すみません。
このように使う。結果はWP_BlogLink.txtに書き出される。
$ php WPExportXMLExtract.php WPからエクスポートしたファイル名 > WP_BlogLink.txt
■MovabletypeのURLとエントリタイトルの取得
ブログのアーカイブページを表示させページソースからURLとエントリタイトルを手動でファイルに保存する(MT_BlogLink.txt)。ここ、いきなり原始的になるが、手っ取り早いのでこうした。
残すファイルの内容は、URLとエントリタイトルをカンマ区切りにして1行に1エントリとする。
要するに、上記で抽出したWPの抽出内容と同じ形式にする。なお、ファイル保存時の文字エンコーディングは忘れずにUTF-8としておくこと。
■RewriteRuleの自動生成
これまでに準備した3つのファイル( Gg_BlogLink.txt, WP_BlogLink.txt, MT_BlogLink.txt)を元に、以下スクリプトでRewriteRuleを自動生成する。
スクリプトは失われました。すみません。
こんな感じで実行すると、httpd.confに記載すべきRewriteRuleが吐かれます。
$ php CreateRewriteRule.php > RewriteRule.txt
■ブログのフォルダを入れ替える(rename)
- MTのフォルダ:blog
- WPのフォルダ:wp_blog
という状況なので以下の手順で入れ替える。
WPの設定画面([設定]→[一般])で、アドレスを変更する。
設定前
WordPress のアドレス (URL) http://www.ivoryworks.com/wp_blog
ブログのアドレス (URL) http://www.ivoryworks.com/wp_blog
設定後
WordPress のアドレス (URL) http://www.ivoryworks.com/blog
ブログのアドレス (URL) http://www.ivoryworks.com/blog
アドレスを変更した事により、『変更を保存』ボタンを押下すると元のページに戻れなくなるが問題ない。
次に、MTのフォルダをrenameする。例えば『blog』→『mt_blog』というように。
最後に、WPのフォルダ名をrenameする。『wp_blog』→『blog』
おしまい。