NucleusからWordPressへ移行

このサイトhttp://diary.mrmt.netをNucleusからWordPressへ移行してみた。参考にしたのはこのへん:

この http://diary.mrmt.net は、1998年〜2005年ぐらいまでは Tomsoft Diary System(TDS), それから Nucleus CMS というプラットフォームの変遷があり、そのたびにいろいろ改造したり、URL互換性を担保すべくいじったりしているので、RewriteRule だけでも結構ものすごいことになっていた。このさい、あまりに古いものは捨てることにした。

まずデータ書き出しだが、NP_ImpExp v1.1を使う。ただ、記事ごとのpermalinkを担保するために、Nucleus時代の記事番号もITEMIDというパラメータで書き出すようにプラグインを修正。

gist5e98864eb0375e00a6ed

つぎにWordPressを入れる。Debian GNU/Linux lennyのホストがあったのでそれに入れる。ちなみにここで使っているWordPressは2.5.1. 古いですよね。Debian GNU/Linux lennyのWordPressはこれなんだ。すまん。

# apt-get install wordpress

ほんとにすっぴんのホストだったので、apache2とかもこの時点で依存関係でインストールされました。

インストールされたら, /usr/share/doc/wordpress/examples/apache.conf を参考に, /etc/apache2/sites-available/wordpress とか作って a2ensite wordpress

おっと、ちゃんと準備が整うまで、このWordPress用のname based virtual hostには basic auth かけときましょう。

つぎにMySQL (サーバ側)もインストール.

# apt-get install mysql-server-5.0

Debian GNU/LinuxのWordPressの場合、以下のスクリプトを実行するだけでMySQL関係のセットアップが完了します。

# sudo sh /usr/share/doc/wordpress/examples/setup-mysql -n wp [wordpress用のFQDN]

あとは、MT記法のexportファイルのITEMID:を受け取って、それをWordPress側のCustom Fieldとして受け取るようにする。あとは、NucleusからMT形式でコンテンツをexportし、それをWordPressでimportしてやればいい。

gistcee4d1fb779d26c3c53a

途中で何度も何度もタイムアウトが発生し、importできない記事が発生した。その都度importファイルを分割して手で修正とかしていった。原因はそのときはわからず、気合いで乗り切ってしまったのだが、あとになって、これは記事名称が重複している場合に発生する問題らしい気がしてきた。

実際、普通に手で記事を書く場合でも、過去にすでにあるタイトルと同じタイトルの記事は、publishするさいに、なかで延々と考え込んでタイムアウトしてしまう。(同名を避けようとあれこれする処理がバグっている気がする)

なので、workaroundとしては、MT形式にexportしたファイルの時点で、重複タイトルをチェックして、あとで検索・除去しやすいようなゴミ文字列を適宜タイトルにくっつけてやるのがいいのかもしれない。

本筋はWordPress本体の修正とパッチ報告だが、古いバージョンのWordPressの問題を追っかける気もしないし、upstreamもパッチ受け取る熱量は低いだろうしね…

importできたら、いったん全体をexportする。XMLの固まりができるので、そこから、WordPressの記事番号と、Nucleus時代のitemidの組み合わせを取り出す。ここはXML::Simpleあたりの出番なわけだが、吐かれたXMLがいまいちparseに失敗する代物で、調べかけたけど5分で撤退。どうせone shotの作業だし、grepとかEmacsを駆使して手作業で切り出しておしまい。

あとは、こんな感じになるように加工して、virtualhost定義に貼り付ける。1500行近くありました。

                    Redirect permanent /item/1005 /2010
                    Redirect permanent /item/1334 /2295

こういう記述は、mod_rewriteには外部スクリプトに判断処理を渡す機能もあるので、それを使えばエレガントかもしれないけど、以前仕様を読んだときの記憶では、パイプのやり取りあたりの仕様が、いまいちrobustかどうなんだろうか。

WordPressのphpの中に書いてもいいけど、これはこれで「WordPress本体」と「local hack」の切り分けがめんどい。

なので、べたーっといっぱい書いてあるという愚直な方法も、TPOでアリだと思うのでした。基本的に、単に並べたほうが見通しが良いものを、正規表現でくくって美しく… とか斜め上に凝りだすのは、(自動最適化工程とかならさておき) 中学生のオナニーだと思っています。

WordPress自体は、permalinkの受け方を

/%post_id%

と設定してあります。これで、http://diary.mrmt.net/item/1334 (Nucleus時代のpermalink) が、http://diary.mrmt.net/2295 (WordPress時代のpermalink) に 301でredirectされます。

あとはとりあえずIWPhoneでiPhone対応. さらにGoogle Analytics, Google AdSense あたりを入れておしまい。

他にもDNS切り替え(TTLを短縮しておく, etc)とか、これまでの数々のlocal hackの互換性の尻拭い(一定以上古いURLへのアクセスはmod_proxyも併用してtds運用空間を作ってそこにリダイレクトなど)がいっぱいありますが、site localすぎる話なのでばっさり省略。

gistcb18ae7fb2281f3662a0