M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2010年2月15日 19:21

TypePadからMovableTypeに移行するときPerlスクリプトを使い元のPermalinkになるようBasenameを設定する

このエントリーをはてなブックマークに追加 mixiチェック

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 を参考にしてカスタムで入れる必要があるかも。

Mt4namingrule▲この設定にしておかないと、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

投稿 大野 義貴 [TypePad] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3133

コメントする