MT3のエクスポート,インポートで basename (パーマリンク) を引き継ぐ方法。
公開日 : 2007-08-22 14:16:17
つまりMT3からMT4へ移行する時に、データベースのアップグレードじゃなくてエクスポート/インポート機能を使って移行したかったので (だって、せっかくだから「まっさら」にしたいじゃん)。
MT3.xの場合、エクスポート/インポート機能を使ってブログを移行すると エントリーの (カテゴリーも) basename が引き継がれません。つまり「パーマリンク」が変わってしまう。
何のための「パーマリンク」やねん! ってことで basename を引き継いで移行する方法を書いておく(さっきローカルのMT4にこのブログをエクスポート/インポートした。だってテストとかプラグイン開発とかするのにエントリー空っぽじゃなんだかやりにくいし)。
手順は以下の通り。
- もしエントリーの「使っていないフィールド」があれば、そのフィールドに basename フィールドの値を移す。
- 「使っていないフィールド」がなければ、どっかのフィールドにHTMLのコメントとかにしてbasename フィールドの値を突っ込む。
- エクスポート/インポートする。
エクスポートインポートした方のブログで、別の場所に突っ込んだ basename を basenameフィールドに突っ込む。- いらなくなった basename を削除する。
このブログでは「使っていないフィールド」が無かったので、以下のようなスクリプトを書いた(MTフォルダに置いて実行)。
#!/usr/bin/perl -w
my $MTDIR;
use strict;
BEGIN {
if ( $0 =~ m!(.*[/¥¥])! ) {
$MTDIR = $1;
} else {
$MTDIR = './';
}
unshift @INC, $MTDIR . './lib';
unshift @INC, $MTDIR . './extlib';
}
use MT;
my $mt = MT->new(Config => $MTDIR.'./mt-config.cgi');
my $iter = MT::Entry->load_iter({blog_id=>1});
while (my $entry = $iter->()) {
my $basename = '<!--basename['.$entry->basename.']-->';
my $text = $entry->text.$basename;
$entry->text($text);
$entry->save or die $entry->errstr;
print $basename;
print "¥n";
}
エクスポート/インポート後、以下のスクリプトを走らせる(whileの中身だけ書くね)。
while (my $entry = $iter->()) {
my $text = $entry->text;
my $pick_basename = $1 if {$text=~/<!¥-¥-basename¥[(.*?)¥]¥-¥->/};
$text =~ s/<!¥-¥-basename¥[.*?¥]¥-¥->//;
$entry->text($text);
$entry->basename($pick_basename);
$entry->save or die $entry->errstr;
print $pick_basename;
print "¥n";
}
ついでに、元のブログの方も entry_text フィールドに追加したコメントを削除。
while (my $entry = $iter->()) {
my $text = $entry->text;
$text =~ s/<!¥-¥-basename¥[.*?¥]¥-¥->//;
$entry->text($text);
$entry->save or die $entry->errstr;
}
アーカイブマッピングの関係で、カテゴリーの basename を引き継ぐ必要がある場合は、上記の方法と同時に以下の処理を行えばOK。
- カテゴリ名をカテゴリーの description にHTMLのコメントで突っ込む(上記エントリーのやり方と同じ)。
- カテゴリー名をカテゴリーの basename にする。
- インポート/エクスポート後に元に戻す。
あ、一応やる場合はデータベースのバックアップとっておくってのと、自己責任だからね!