MovableType から WordPress へのエントリーの移行

 喧嘩してるのを見るのはなんかイヤだったので、MovableType から WordPress への移行の仕方を調べてみました。実際に移行するかどうかは別として、ただその可能性を探りたかったのです。そして探っているうちに WordPress を触るのが楽しくなってきました。
 今夜はエントリーの移行にスポットをあててみます。

 移行元の MovableType 4.1 日本語版は下記のようなスペックです。

  • エントリー 1835(うち未公開 2)
  • コメント 1154
  • トラックバック 676
  • カテゴリー 29
  • タグ 700(700!)
  • エントリーの改行フォーマットは、デフォルトの『改行を変換』が約1450、MarkDown + SmartyPants が約400

 移行先の WordPress はわーどぷれすっ! » アップグレードをどうするか?を参考に Subversion repository からチェックアウトしたものを使いました。

svn co http://svn.automattic.com/wordpress/branches/2.3/ /home/****/blog
svn co http://svn.automattic.com/wordpress-i18n/ja/branches/2.3/messages/ /home/****/blog/wp-content/languages

 まずはマニュアル(Importing from Movable Type to WordPress « WordPress Codex)に沿ってインポート作業を行ってみました。
 手順は MovableType で書き出したファイルを WordPress に読み込むという流れになります。それぞれデフォルトの状態で進めると問題に遭遇したので、MovableType(書き出す側)とWordPress(読み込む側)のプログラムに修正を加えて問題を克服しようというのがこのエントリーの趣旨です。
 以下が遭遇した問題です。

  1. 行末に付けた半角スペースと改行が取り除かれてしまう。
  2. エントリーに付けたタグが移行されない。
  3. コメントとトラックバックの区別がなくなっている。
  4. エントリーごとに改行フォーマットを選べない。

行末に付けた半角スペースと改行が取り除かれてしまう。

 MarkDown 記法では改行したい行末に半角スペースを2つ書くのですが、これがなぜか WordPress へのインポート時に消えてしまっていました。
 WordPressの(読み込む側の)wp-admin/import/mt.php に以下のパッチを当てると解決します。

--- mt.php.org  2007-09-27 08:23:22.000000000 +0900
+++ mt.php      2008-03-14 00:34:47.000000000 +0900
@@ -278,7 +284,7 @@
                echo "<div class='wrap'><ol>";

                while ( $line = fgets($handle) ) {
-                       $line = trim($line);
+                       $line = rtrim($line, "\n");

                        if ( '-----' == $line ) {
                                // Finishing a multi-line field

 こちらのサイトを参考にさせていただきました。

エントリーに付けたタグが移行されない。

 WordPress ではバージョン2.3からタグ機能がデフォルトで搭載されたそうです。
 WordPressの(読み込む側の)wp-admin/import/mt.php に以下のパッチを当てると解決します。

--- mt.php.org  2007-09-27 08:23:22.000000000 +0900
+++ mt.php      2008-03-14 00:34:47.000000000 +0900
@@ -224,6 +224,10 @@
                        }
                }

+               //tags import
+               if( $post->tags)
+                       wp_add_post_tags($post_id, $post->tags);
+
                $num_comments = 0;
                foreach ( $comments as $comment ) {
                        $comment = get_object_vars($comment);
@@ -350,6 +356,12 @@
                                $category = trim( substr($line, strlen("PRIMARY CATEGORY:")) );
                                if ( '' != $category )
                                        $post->categories[] = $category;
+                               //tags import
+                       } else if ( 0 === strpos($line, "TAGS:") ) {
+                               $tags = trim( substr($line, strlen("TAGS:")) );
+                               $tags= preg_replace("|\n*-----|s", '',$tags);
+                               if ( '' != $tags )
+                               $post->tags = $tags;
                        } else if ( 0 === strpos($line, "DATE:") ) {
                                $date = trim( substr($line, strlen("DATE:")) );
                                $date = strtotime($date);

 こちらのサイトを参考にさせていただきました。

コメントとトラックバックの区別がなくなっている。

 WordPress では MovableType ほどにはコメントとトラックバックの区別がなされていないみたいなのですが(きちんと調べてないので確証は出来ないです><)、少なくとも MySQL にはコメントとトラックバックを区別するフラグは入っていました。コメントもトラックバックも MySQL 上では同じ wp_comments テーブルに格納されるようですが、トラックバックの場合は comment_type カラムに ‘trackback’ と文字列が保存されるようです。
 WordPressの(読み込む側の)wp-admin/import/mt.php に以下のパッチを当てると解決します。

--- mt.php.org  2007-09-27 08:23:22.000000000 +0900
+++ mt.php      2008-03-14 00:34:47.000000000 +0900
@@ -245,6 +249,8 @@
                        $ping = get_object_vars($ping);
                        $ping = add_magic_quotes($ping);

+                       // comment_type for trackback
+                       $ping['comment_type'] = "trackback";
                        if ( !comment_exists($ping['comment_author'], $ping['comment_date'])) {
                                $ping['comment_content'] = "<strong>{$ping['title']}</strong>\n\n{$ping['comment_content']}";
                                $ping['comment_post_ID'] = $post_id;

エントリーごとに改行フォーマットを選べない。

 すいません、こちらはスマートな解決策ではありません。
 MovableType での設定がデフォルトの『改行を変換』と MarkDown + SmartyPants の2種類だったので、MarkDown とそれ以外、という戦法で行くことにしました。改行フォーマットが MarkDown ではないエントリーには、本文の最初に <!-- nomarkdown --> を追加します。そして WordPress にインストールした PHP Markdown Extra プラグインを改造して、本文の最初に <!-- nomarkdown --> があれば MarkDown を適用しないことにしました。

 MovableTypeの(書き出す側の)lib/MT/ImportExport.pm に以下のパッチを当てます。

--- ImportExport.pm.org 2008-01-23 15:13:12.000000000 +0900
+++ ImportExport.pm     2008-03-13 23:40:10.000000000 +0900
@@ -492,8 +492,8 @@
 DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$><MTEntryIfTagged>
 TAGS: <MTEntryTags include_private="1" glue=","><$MTTagName quote="1"$></MTEntryTags></MTEntryIfTagged>
 -----
-BODY:
-<$MTEntryBody convert_breaks="0"$>
+BODY:<mtsetvarblock name="cb"><$MTEntryFlag flag="convert_breaks"$></mtsetvarblock>
+<MTIf name="cb" eq="__default__"><!-- nomarkdown --></MTIf><$MTEntryBody convert_breaks="0"$>
 -----
 EXTENDED BODY:
 <$MTEntryMore convert_breaks="0"$>

 WordPress にインストールした PHP Markdown Extra プラグインに以下のパッチを当てます。

--- markdown.php.org    2007-09-26 14:41:22.000000000 +0900
+++ markdown.php        2008-03-14 01:21:24.000000000 +0900
@@ -61,7 +61,11 @@
        }

        # Transform text using parser.
-       return $parser->transform($text);
+  if ( !preg_match('/^<!-- nomarkdown -->/', $text) ){
+               return $parser->transform($text);
+  }else{
+    return $text;
+  }
 }


@@ -85,7 +89,7 @@
        # - Run Markdown on excerpt, then remove all tags.
        # - Add paragraph tag around the excerpt, but remove it for the excerpt rss.
        if (MARKDOWN_WP_POSTS) {
-               remove_filter('the_content',     'wpautop');
+//             remove_filter('the_content',     'wpautop');
         remove_filter('the_content_rss', 'wpautop');
                remove_filter('the_excerpt',     'wpautop');
                add_filter('the_content',     'Markdown', 6);

 何度かざっと触ったことがありましたが、今回はわりとじっくり WordPress を触ることが出来ました。MovableType では簡単に出来ていたことが WordPress でどうやればいいかわからないとか、でも再構築しなくていいのはやっぱり良いよなとか、いろいろ思いました。
 また、テンプレートに関しては MovableType で mt.Vicuna を利用させていただいていたので、WordPress でも wp.Vicuna を使ってみました。WordPress のテンプレートについてはまったく知識がないので、これからマニュアルなどを読んでテンプレートのカスタマイズもやっていきたいと思います。プラグインもいろいろ試してみたいな。

 今回は detlog.org の nao さんにご協力いただきながら進めました。twitter の direct message や IM を通じてのボクの質問攻撃に快く答えてくださったことに感謝します。

comments powered by Disqus