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
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3133
コメントする