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_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もインポートしていない。

対策

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

Powered by PukiWiki

Comments