WordPress 3.0にMovable Typeのタグをインポートする
WordPress 3.0にMovable Typeの記事をインポートする際、Movable Typeのタグをインポートする方法を紹介します。WordPress 3.0でしか試していませんが、WordPress 2.xでも可能かもしれません。
1.概要
WordPress 3.0にMovable Typeの記事をインポートするには、「Movable Type and TypePad Importer」というプラグインを利用しますが、このプラグインでは次の機能しか提供されていません。
- Movable TypeのキーワードフィールドをWordPressの記事のタグとしてインポート
- Movable Typeのタグフィールドはインポート対象外
理由は、MTの途中のバージョンから、インポートフォーマットに「TAGS」というタグを示すフィールドが追加(タグ自体も途中のバージョンから追加)され、「Movable Type and TypePad Importer」プラグインがその仕様に追従していないためと思われます。
本エントリーのカスタマイズを行えば、次のようにMovable Typeのインポート形式のフォーマットに設定されたタグ(青色部分)を、WordPressにインポートすることができます。
Movable Typeのインポートフォーマット(サンプル)
AUTHOR: mtbook
TITLE: モバイルサイトオープン
BASENAME: post-9
STATUS: Publish
ALLOW COMMENTS: 0
CONVERT BREAKS: __default__
ALLOW PINGS: 1
PRIMARY CATEGORY: 子カテゴリ1
CATEGORY: イベント
CATEGORY: 子カテゴリ1
DATE: 09/13/2010 05:46:27 PM
TAGS: モバイル,キャンペーン
…後略…
インポート後の記事一覧画面
このカスタマイズでは、キーワードフィールドの内容をタグにインポートしない制御もあわせて行います。
2.プラグインのインストール
管理画面より「ツール」→「インポート」をクリックして、「Movable Type と TypePad」をクリック。
ダイアログが開くので、右上の「いますぐインストール」をクリック。
「Movable Type and TypePad Importer x.x のインストールが完了しました。」が表示されればインストール完了です。この状態では有効化されていないので、「プラグインを有効化してインポートツールを実行」をクリックするか(この段階ではインポートは実行しません)、プラグイン一覧画面でMovable Type and TypePad Importerを有効化します。
3.プラグインファイルの編集
wp-content/movabletype-importer配下にある、movabletype-importer.phpを編集します。まず、save_post関数の中にある2行を書き換えます。
変更前(赤色部分が変更対象)
function save_post(&$post, &$comments, &$pings) {
$post = get_object_vars($post);
$post = add_magic_quotes($post);
$post = (object) $post;
if ( $post_id = post_exists($post->post_title, '', $post->post_date) ) {
echo '<li>';
printf(__('Post <em>%s</em> already exists.', 'movabletype-importer'), stripslashes($post->post_title));
} else {
echo '<li>';
printf(__('Importing post <em>%s</em>...', 'movabletype-importer'), stripslashes($post->post_title));
if ( '' != trim( $post->extended ) )
$post->post_content .= "\n<!--more-->\n$post->extended";
$post->post_author = $this->checkauthor($post->post_author); //just so that if a post already exists, new users are not created by checkauthor
$post_id = wp_insert_post($post);
if ( is_wp_error( $post_id ) )
return $post_id;
// Add categories.
if ( 0 != count($post->categories) ) {
wp_create_categories($post->categories, $post_id);
}
// Add tags or keywords
if ( 1 < strlen($post->post_keywords) ) {
// Keywords exist.
printf('<br />'.__('Adding tags <em>%s</em>...', 'movabletype-importer'), stripslashes($post->post_keywords));
wp_add_post_tags($post_id, $post->post_keywords);
}
}
…中略…
}
変更後(青色部分が変更後のソースコード)
function save_post(&$post, &$comments, &$pings, &$tags) {
$post = get_object_vars($post);
$post = add_magic_quotes($post);
$post = (object) $post;
if ( $post_id = post_exists($post->post_title, '', $post->post_date) ) {
echo '<li>';
printf(__('Post <em>%s</em> already exists.', 'movabletype-importer'), stripslashes($post->post_title));
} else {
echo '<li>';
printf(__('Importing post <em>%s</em>...', 'movabletype-importer'), stripslashes($post->post_title));
if ( '' != trim( $post->extended ) )
$post->post_content .= "\n<!--more-->\n$post->extended";
$post->post_author = $this->checkauthor($post->post_author); //just so that if a post already exists, new users are not created by checkauthor
$post_id = wp_insert_post($post);
if ( is_wp_error( $post_id ) )
return $post_id;
// Add categories.
if ( 0 != count($post->categories) ) {
wp_create_categories($post->categories, $post_id);
}
// Add tags or keywords
if ( 1 < strlen($tags) ) {
// Keywords exist.
printf('<br />'.__('Adding tags <em>%s</em>...', 'movabletype-importer'), stripslashes($tags));
wp_add_post_tags($post_id, $tags);
}
}
…中略…
}
もうひとつ、process_postという関数を修正します。
変更前(赤色部分が変更対象)
function process_posts() {
global $wpdb;
$handle = $this->fopen($this->file, 'r');
if ( $handle == null )
return false;
$context = '';
$post = new StdClass();
$comment = new StdClass();
$comments = array();
$ping = new StdClass();
$pings = array();
echo "<div class='wrap'><ol>";
while ( $line = $this->fgets($handle) ) {
$line = trim($line);
if ( '-----' == $line ) {
// Finishing a multi-line field
if ( 'comment' == $context ) {
$comments[] = $comment;
$comment = new StdClass();
} else if ( 'ping' == $context ) {
$pings[] = $ping;
$ping = new StdClass();
}
$context = '';
} else if ( '--------' == $line ) {
// Finishing a post.
$context = '';
$result = $this->save_post($post, $comments, $pings);
if ( is_wp_error( $result ) )
return $result;
$post = new StdClass;
$comment = new StdClass();
$ping = new StdClass();
$comments = array();
$pings = array();
} else if ( 'BODY:' == $line ) {
$context = 'body';
} else if ( 'EXTENDED BODY:' == $line ) {
$context = 'extended';
} else if ( 'EXCERPT:' == $line ) {
$context = 'excerpt';
} else if ( 'KEYWORDS:' == $line ) {
$context = 'keywords';
} else if ( 'COMMENT:' == $line ) {
$context = 'comment';
} else if ( 'PING:' == $line ) {
$context = 'ping';
} else if ( 0 === strpos($line, "AUTHOR:") ) {
$author = trim( substr($line, strlen("AUTHOR:")) );
if ( '' == $context )
$post->post_author = $author;
else if ( 'comment' == $context )
$comment->comment_author = $author;
} else if ( 0 === strpos($line, "TITLE:") ) {
$title = trim( substr($line, strlen("TITLE:")) );
if ( '' == $context )
$post->post_title = $title;
else if ( 'ping' == $context )
$ping->title = $title;
} else if ( 0 === strpos($line, "STATUS:") ) {
$status = trim( strtolower( substr($line, strlen("STATUS:")) ) );
if ( empty($status) )
$status = 'publish';
$post->post_status = $status;
} else if ( 0 === strpos($line, "ALLOW COMMENTS:") ) {
$allow = trim( substr($line, strlen("ALLOW COMMENTS:")) );
if ( $allow == 1 )
$post->comment_status = 'open';
else
$post->comment_status = 'closed';
} else if ( 0 === strpos($line, "ALLOW PINGS:") ) {
$allow = trim( substr($line, strlen("ALLOW PINGS:")) );
if ( $allow == 1 )
$post->ping_status = 'open';
else
$post->ping_status = 'closed';
} else if ( 0 === strpos($line, "CATEGORY:") ) {
$category = trim( substr($line, strlen("CATEGORY:")) );
if ( '' != $category )
$post->categories[] = $category;
} else if ( 0 === strpos($line, "PRIMARY CATEGORY:") ) {
$category = trim( substr($line, strlen("PRIMARY CATEGORY:")) );
if ( '' != $category )
$post->categories[] = $category;
…中略…
}
}
…中略…
}
変更後(青色部分が変更後または追加となるソースコード)
function process_posts() {
global $wpdb;
$handle = $this->fopen($this->file, 'r');
if ( $handle == null )
return false;
$context = '';
$post = new StdClass();
$comment = new StdClass();
$comments = array();
$ping = new StdClass();
$pings = array();
$tags = '';
echo "<div class='wrap'><ol>";
while ( $line = $this->fgets($handle) ) {
$line = trim($line);
if ( '-----' == $line ) {
// Finishing a multi-line field
if ( 'comment' == $context ) {
$comments[] = $comment;
$comment = new StdClass();
} else if ( 'ping' == $context ) {
$pings[] = $ping;
$ping = new StdClass();
}
$context = '';
} else if ( '--------' == $line ) {
// Finishing a post.
$context = '';
$result = $this->save_post($post, $comments, $pings, $tags);
if ( is_wp_error( $result ) )
return $result;
$post = new StdClass;
$comment = new StdClass();
$ping = new StdClass();
$comments = array();
$pings = array();
$tags = '';
} else if ( 'BODY:' == $line ) {
$context = 'body';
} else if ( 'EXTENDED BODY:' == $line ) {
$context = 'extended';
} else if ( 'EXCERPT:' == $line ) {
$context = 'excerpt';
} else if ( 'KEYWORDS:' == $line ) {
$context = 'keywords';
} else if ( 'COMMENT:' == $line ) {
$context = 'comment';
} else if ( 'PING:' == $line ) {
$context = 'ping';
} else if ( 0 === strpos($line, "AUTHOR:") ) {
$author = trim( substr($line, strlen("AUTHOR:")) );
if ( '' == $context )
$post->post_author = $author;
else if ( 'comment' == $context )
$comment->comment_author = $author;
} else if ( 0 === strpos($line, "TITLE:") ) {
$title = trim( substr($line, strlen("TITLE:")) );
if ( '' == $context )
$post->post_title = $title;
else if ( 'ping' == $context )
$ping->title = $title;
} else if ( 0 === strpos($line, "STATUS:") ) {
$status = trim( strtolower( substr($line, strlen("STATUS:")) ) );
if ( empty($status) )
$status = 'publish';
$post->post_status = $status;
} else if ( 0 === strpos($line, "ALLOW COMMENTS:") ) {
$allow = trim( substr($line, strlen("ALLOW COMMENTS:")) );
if ( $allow == 1 )
$post->comment_status = 'open';
else
$post->comment_status = 'closed';
} else if ( 0 === strpos($line, "ALLOW PINGS:") ) {
$allow = trim( substr($line, strlen("ALLOW PINGS:")) );
if ( $allow == 1 )
$post->ping_status = 'open';
else
$post->ping_status = 'closed';
} else if ( 0 === strpos($line, "CATEGORY:") ) {
$category = trim( substr($line, strlen("CATEGORY:")) );
if ( '' != $category )
$post->categories[] = $category;
} else if ( 0 === strpos($line, "TAGS:") ) {
$tags = trim( substr($line, strlen("TAGS:")) );
} else if ( 0 === strpos($line, "PRIMARY CATEGORY:") ) {
$category = trim( substr($line, strlen("PRIMARY CATEGORY:")) );
if ( '' != $category )
$post->categories[] = $category;
…中略…
}
}
…中略…
}
4.インポートの実行
管理画面より「ツール」→「インポート」をクリックして、「Movable Type と TypePad」をクリック。
インポートするファイルを選択して「ファイルをアップロードしてインポート」をクリック。
ユーザーを選択して「Submit」をクリック。
記事がインポートされ、タグがある場合は「Adding tags」が表示されます。
記事の一覧でタグがインポートされていることが分かります。
記事編集画面でもインポートされていることが分かります。
2010.09.24
save_post修正後のソースコードに修正もれがあったので、追記しました。
- WordPressのタグアーカイブにnoindexを設定する方法
- WordPressで正しいユーザー・パスワードでログインできなくなった場合の対処
- WordPressのthe_excerpt()をカスタマイズする
- WordPressで抜粋の文字数を変更する方法
- WordPress 3.0 で廃止された非推奨グローバル変数一覧
- WordPress の the_date を変更して記事ごとに日付を表示する
- 著作権表示の年号を自動更新するプラグイン V1.1 for WordPress
- 著作権表示の年号を自動更新するプラグイン for WordPress
- WordPress でステータスコード 404(Not Found)を返却するエラーページを作る
- WordPress に Movable Type 風の「Syndicate this site」を表示する
- WordPress における日付/時間の表示とフォーマット変更方法
はじめまして。
こちらの情報を参考にさせていただき、プラグインを修正し、
無事にタグ情報をインポートすることができました。
大変助かりました、ありがとうございます。
プラグインの修正について、もう1箇所修正が必要な箇所がありました。
おそらく記載漏れだと思うのですが。。。
以下の部分です。
save_post メソッド
280行目付近
if ( 1 < strlen($post->post_keywords) ) {
↓
if ( 1 < strlen($tags) ) {
それでは!
>huskyさん
こんにちは。
ご返事遅くなってすいません。
コメント&修正のご連絡ありがとうございました。
最初に頂いたコメントのソースコードを修正して、後の2件のコメントを削除致しました。
それではよろしくお願い致します。