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_post
に update_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もインポートしていない。
対応
たいした数じゃないのでインポート後に手動で設定する。