TypePadからMovableTypeに移行するときPerlスクリプトを使い元のPermalinkになるようBasenameを設定する
TypePadからエクスポートして、MovableTypeにインポートすると、Permalinkのファイル名(Basenameに由来)が書き換わっちゃうという問題は2004年の時点から言われていた問題で(まてMovableTypeってそんなに古いのかよ)、これを解決するために、Perlでスクリプトを書いたというお話。
シチュエーションとしては、TypePadの方のblogはまだURLが生きていて、これからLinuxサーバで稼働しているMovableTypeに移設しようとしているという想定。だから、DNSの切り替えはまだしていないってことですね。
~~~
1. TypePadからエクスポートして、MovableTypeにインポート
まず、MovableTypeにエントリをすべて移設します。やり方は、TypePadの方でエクスポートを選び、ファイルをダウンロードしたあと、MovableTypeの方で、インポートを選び、ダウンロードしたファイルをアップロードします。あちこちにやり方があるので割愛。
この時点で、MovableTypeの方のエントリのファイル名は、元のTypePadの方のエントリと違っています。
2. TypePadでエントリタイトル-Permalinkの対応表を書き出し
次に、TypePadの方で、次のようなテンプレートを作ります。
Filename: title-permalink.yaml
--- <MTEntries lastn="9999"><$MTEntryTitle$>: <$MTEntryPermalink$> </MTEntries>
これは、エントリタイトルとPermalinkの対応表となります。
これをTypePadで再構築すると、
--- ブログエントリ1: http://example.com/2008/01/post_1.html ブログエントリ2: http://example.com/2008/01/post_1.html … ブログエントリ99: http://example.com/2008/01/post_99.html
とかなります。これには、http://example.com/title-permalink.yaml でアクセスできるとしよう。
3. MovableTypeのアーカイブテンプレートのPermalink命名規則を設定し直す
今度は、MovableTypeの、インポートしたblogの「デザイン-テンプレート」の中の、「アーカイブテンプレート」の「ブログ記事」を選択。
下の方の「テンプレートの設定」を開き、 「アーカイブマッピング」のところがデフォルトだと「yyyy/mm/entry-basename.html」となっているので、「yyyy/mm/entry_basename.html」を選択し直します。これをしておかないと、TypePadのアンダースコアを含むpermakinkがハイフンになってしまうので注意。あと、ディレクトリのほりかたを特殊にしていた場合は、選択肢の中にないかもしれないので、http://www.movabletype.jp/documentation/appendices/archive-file-path-specifiers.html を参考にしてカスタムで入れる必要があるかも。
▲この設定にしておかないと、post_1.htmlが永遠にpost-1.htmlで書き出されることに……
4. MovableTypeが稼働しているサーバで書換スクリプトを走らせる
ここまでやったら、MovableType4が設置されているサーバで、こんなPerlスクリプトを走らせる。
このスクリプトはこのままではなくて、各自の環境に合わせて、blog_idの箇所と、getの箇所を変えなきゃダメ。また、いきなり書き換えちゃうので、バックアップをとるとか、テストとして、$entry->saveの行頭に#をつけてコメントアウトしておくとか、しておくといいかも。
スクリプトの内容は、MovableTypeの操作をするライブラリ(MovableType付属)を使い、Permalinkの不統一の元となっている勝手に生成されたBasenameを、TypePad側で書き出したyamlファイルを参照して、TypePadのものに書き換えています。
Filename: mt_changebasename.pl
#!/usr/bin/perl
use strict;
use warnings;
use lib '/path/to/mt/lib';
use Encode;
use LWP::Simple;
use MT;
use utf8;
use YAML;
my $data = get('http://example.com/title-permalink.yaml');
my $list = YAML::Load($data);
#print Dump($list);
#exit;
my $mt = MT->new( Config => '/path/to/mt/mt-config.cgi' );
my @entries = MT::Entry->load({
blog_id => 99,
status => 2,
});
foreach my $entry (@entries) { # $entryには、MT::Entryオブジェクト
my $title = $entry->title;
my $permalink = $list->{decode_utf8($title)};
(my $basename = $permalink) =~ s{^.+/(.+)\..+}{$1};
# PermalinkからBasenameへ
my $o_basename = $entry->basename; # 書き換え前のBasename
$entry->basename($basename); # MT::Entry objのBasename書換
$entry->save or die $entry->errstr; # MT::Entry obj書込
print "$title $o_basename->$basename\n";
}
exit;
__END__
これが終わったら、MovableTypeのblogを再構築する。
お疲れ様でした。
僕はこれをもう46回やらなくてはいけない。うげげ。
参考にした: MT::ObjectこそがMTの本質であると勝手に思っている。 - Junnama Online
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/19018/47576188
この記事へのトラックバック一覧です: TypePadからMovableTypeに移行するときPerlスクリプトを使い元のPermalinkになるようBasenameを設定する:






![森田 創: WEB+DB PRESS 総集編 [Vol.1~60]](http://ecx.images-amazon.com/images/I/51aE58LxWlL._SL75_.jpg)
















![: 電子ルーペ ViewPe[ビューペ] 3R-MSV35 マイクロスコープ デジタル顕微鏡 高機能 低価格 読書 植物 研究 肌チェック](http://ecx.images-amazon.com/images/I/41erkiQgAsL._SL75_.jpg)





![: Optimus bright [docomo L-07C] 対応 予備バッテリー 1500mAh BL-44JN](http://ecx.images-amazon.com/images/I/41gjqsDjq%2BL._SL75_.jpg)










![: パンツの穴 [DVD]](http://ecx.images-amazon.com/images/I/21R9SEY1HPL._SL75_.jpg)

















