過去記事を FC2 ブログから WordPress にインポートしようと考えている。FC2 ブログは Movable Type 形式で記事をエクスポートできるので、これを WordPress で読み込めばよい。しかし、単純にエクスポートとインポートをすれば良いということでなく、インポート前に以下の様な処理が必要となる。
- アンカーに埋め込まれた自ブログ記事や画像等へのリンクの URL 変換
- 文字コードを EUC から UTF-8 へ変換
1. を単純に進めるためには ID (記事 URL の数字の部分) を維持したまま WordPress へインポートしなければならない。これができないと新旧記事番号の変換テーブルを使わなければならないので、URL 変換処理がかなり面倒くさいことになる。 世には ID を維持したまま Movable Type から WordPress にブログエントリを移す Tips 紹介記事があふれているがどうも情報が古い。私の WordPress 3.2 には wp-admin/import/mt.php なんていうファイルは存在しないから、修正しろと言われても困る。仕方ないので調べてみる。 WordPress 3.2 では素直に管理画面からインポートメニューを選んでいくと「Movable Type and TypePad Importer」というプラグインを使うことになる。残念ながらこのツールには記事 ID を指定してインポートする機能はない。 インポート用プラグインのソースを眺めると wp_insert_post 関数を使って記事をポストしている。この関数を調べると $post->ID というパラメータと $post->import_id というパラメータを渡すことができる。更に wp_insert_post の中を見ながら試してみると、既にその ID で記事が存在する場合は $post->ID を指定し、そうでないときは $post->import_id を指定すれば、希望通りの ID で記事をインポートできることがわかった。 というわけで、プラグインソースを以下のように直し、import_id を使って記事番号を指定するようにした。
— movabletype-importer.php.orig 2011-01-15 09:53:03.000000000 +0900
+++ movabletype-importer.php 2011-08-02 20:22:59.000000000 +0900
@@ -388,6 +388,10 @@
$slug = trim( substr($line, strlen('BASENAME:')) );
if ( !empty( $slug ) )
$post->post_name = $slug;
+ } else if ( 0 === strpos($line, 'ID:') ) {
+ $post_id = trim( substr($line, strlen('ID:')) );
+ if ( !empty( $post_id ) )
+ $post->import_id = $post_id;
} else if ( 0 === strpos($line, 'STATUS:') ) {
$status = trim( strtolower( substr($line, strlen('STATUS:')) ) );
if ( empty($status) )
後は FC2 ブログからエクスポートした記事データと sitemaps.xml を使って ID 込みのインポート用データを作れば良い。結局これはこれで sitemaps.xml からタイトル <-> 記事番号変換テーブルを作って使ったりするような気がするけど、まあ、ここは以前やったことだし。 MySQL の wp_posts テーブルを見て既に使われている ID も確認しておかなければならない。「投稿」だけでなく「固定ページ」にも ID が振られることに注意。余分な投稿/ページは削除すればその分の ID は空きとなってインポート時に使用できるようになる。 というわけでいよいよ引越しするかな。