サーバー側の事情があり、Nucleus から WordPress へ移行を行いました。
データの移行には変換スクリプトを作成して、REST API で書き込んでいます。変換したのは blog の記事 (item) と画像、category、そして comment です。
●前回の移行
blog 移行は 2回目です。
前回 blog データの移行を行ったときは外部 blog だったので、直接データベースにアクセスすることができませんでした。export ツールはあったものの、出力テキストには記事 id が含まれていないために自分自身へのリンクがどの記事を指しているのかわかりません。
そこで自分自身へのリンクを解決するために、script から http で直接旧 blog のページにアクセスし、日付情報を取得してリンク先を解決する方法を取りました。
その経験から、自分自身へのリンクは blog 固有の記事 id ではなく、できるだけ日付で行うようにしていました。1日1投稿の制限を守れば、id が分からなくてもリンク先の記事が特定できるためです。
●今回の移行
今回は直接データベースにアクセスできるため、変換自体は問題ありませんでした。記事 id (item id) を使ったリンクでも問題なく置き換えできており、日付で自己参照していた意味はありませんでした。
ただし今回は同じサイトということもあり、できるだけ Nucleus 時代の固有 URL を維持するように心がけました。Nucleus の記事 id を WordPress の slug (n+番号) として登録して、従来の記事 id でも容易にアクセスできるようにしています。
実際の置き換えそのものは mod rewrite で行っています。
例えば Nuclues の ~/item/番号 のリンクの変換は
RewriteRule ^item/(\d+) n$1 [R=301,L]
となります。
同じように Nucleus 時代のリンクがエラーにならないよう、archive の日付、category の番号、query を使った「?itemid=番号」や「?virtualpath=」なども変換を行っています。
RewriteCond %{QUERY_STRING} ^virtualpath=(.*)$
RewriteRule ^(.*)$ %1/? [QSD,R=301,L]
RewriteCond %{QUERY_STRING} ^itemid=(.*)$
RewriteRule ^(.*)$ n%1/? [QSD,R=301,L]
RewriteRule ^archive/1/(\d+)-(\d+)-(.*)$ $1/$2/$3 [R=301,L]
RewriteRule ^category/(\d+) category/cat$1 [R=301,L]
実際に使用したスクリプトをこちらに上げておきます。