Movable TypeからWordPressへの移行メモ

kwLog(エントリ数1800件)をMovable Type 4.31からWordPress 2.8.6に移行したときの対策メモ。基本的にMovable TypeでエクスポートしたテキストをWordPressでインポートするだけなんだけどいろいろ問題があったので対応した。

(2009/01/15追記) 対応したプログラムを公開してみた。http://github.com/makotokw/wp-import-mt-patch/downloads
利用については自己責任でお願いします

以前の挫折

  • URLが変わってしまう
  • タグが移行できない
  • ページが移行できない
  • カテゴリが階層化されない

問題と対応

URLが変わってしまう

原因

まず記事のリンクの生成ルールはブログの設定なので記事を移行するだけでは引き継がれない。またこの設定を同じにできてもなお問題が残る。

両方のシステムはエントリのタイトル名を使って postname (Movable Typeでは basename と呼ぶ)なるものを作ってそれをurlに含めようとするがこの postname の作り方がそれぞれ違うので最終的にurlが一致しない。

対応

WordPressは(Movable Typeもだけど)、 postname をエントリごとに任意の文字列で設定できるのでこれをがんばって設定する。しかし、手動で変更するには数が多すぎるのでプログラムで変更する。

/wp-admin/import/mt.phpを修正する。

実はMovable TypeはBASENAMEを出力してくれているようなので、これを拾って入れる。 function process_posts() の中で } else if ( 0 === strpos($line, "DATE:") ) { の上あたりに以下のコードを入れる。

            } else if ( 0 === strpos($line, "BASENAME:") ) {
                $basename = trim( substr($line, strlen("BASENAME:")) );
                if ( '' != $basename ) {
                    $post->post_name = $basename;
                }

function save_post の上あたりに post_name を更新する下記関数を追加する

    function update_post_name($post_id, $post_name) {
        if ($post_id && !empty($post_name)) {
            global $wpdb;
            $wpdb->update($wpdb->posts, array( 'post_name' => sanitize_title($post_name) ), array( 'ID' => $post_id ));
        }
    }

function save_postupdate_post_name を呼び出すコードを追加する。 save_post の中で wp_insert_post を呼び出した後の3行後くらいに入れる。

            $post_id = wp_insert_post($post);
            if ( is_wp_error( $post_id ) )
                return $post_id;

            // Update post_name
            $this->update_post_name($post_id, $post->post_name); // added

すでにインポート後に変更する場合は save_post が始まって10行目。 post_exists の呼び出し後の3行後くらいに入れる。

        if ( $post_id = post_exists($post->post_title, '', $post->post_date) ) {
            echo '<li>';
            printf(__('Post <em>%s</em> already exists.'), stripslashes($post->post_title));
            $this->update_post_name($post_id, $post->post_name); // added
        }

タグが移行できない

原因

WordPressにはTagがない、がTagっぽいものがある(Keyword)。一方Movable TypeはTagもKeywordももっていて、WordPressはMovable TypeのKeywordしか引き継いでくれない模様。

対応

WordPressのインポートツールでMovable TypeのKeywordだけじゃなく、TagもWordPressのKeywordとして取り込むようにする。

function process_posts() の中で } else if ( 0 === strpos($line, "DATE:") ) { の上あたりに以下のコードを入れる。

            } else if ( 0 === strpos($line, "TAGS:") ) {
                $tags = trim( substr($line, strlen("TAGS:")) );
                if ( '' != $tags ) {
                    $post->post_keywords .= str_replace('"', '', $tags);
                }

Movable Typeがタグをcsvチックに出力するときにダブルクォーテーションをつけてくれるんだけどWordPressがこれをそのまま取り込んでしまうので除去している。

ページが移行できない

原因

Movable TypeもWordPressも移行に関してエントリしか想定していない模様。

対応

ページの数はそれほど多くないので手作業でページを作り直す。

カテゴリが階層化できない

原因

カテゴリの階層化自体はWordPressも対応しているが、Movable Typeがカテゴリの階層構造をエクスポートしていない。というかエクスポートしていてもWordPressもインポートしていない。

対応

たいした数じゃないのでインポート後に手動で設定する。