MT3のエクスポート,インポートで basename (パーマリンク) を引き継ぐ方法。

| コメント(2) | トラックバック(1)

つまり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 にする。
  • インポート/エクスポート後に元に戻す。

あ、一応やる場合はデータベースのバックアップとっておくってのと、自己責任だからね!

トラックバック(1)

トラックバックURL: http://junnama.alfasado.net/cgi/mt/mt-tb.cgi/210

●まずは、tempフォルダの設定をレンタルサーバーでMovable Type 4... 続きを読む

コメント(2)

せっかくだから「まっさら」にしたい!精神衛生上、気持ちが悪い。解ります。

以前「まっさら」にした時は、MTEntries で全エントリ分の basename を SQL 文に書き出して、それを RDBMS に直接読み込んで復元させていました。

4 にアップグレードするときは別の方法をとってみました。3 でログインして spam コメント・トラックバックとログなどを全消去したのち、データベースごとバックアップを取ってから、エントリ、コメント、トラックバックなどの、主要なテーブルを除いて、削除しても問題なさそうなテーブルを少しずつ DROP しては 4 にアップグレードし、大丈夫ならバックアップから再び問題のなさそうなテーブルを探り… と、バックアップを基にして「DROP TABLE、アップグレード、DELETE DB、データベース復元」を繰り返しトライ、phpMyAdmin とにらめっこ。最終的にはエントリ、コメント、トラックバックなどいくつかの主要なテーブルだけが残ったデータベースを、4 にアップグレードし、無事に疑似「まっさら」状態を実現しました。念のためアップグレード後にテーブルの構造を真の「まっさら」と比べてみたりして。スッキリ!

あとはバックアップの 3 にログインしつつ、4 にテンプレートを移植たり。

自分の場合、basename 以外に modified_on も残しておきたい、という要求がありました。インポートすると全 modified_on がインポート時刻になってしまうので。

よく考えたら、MT4のエクスポート形式を解析して書き出すためのMT3のインデックステンプレートを作ればいいんじゃね? ってことに気づきました。MT3→MT3の場合はなんらかのプログラム的なものが要りますけど、MT3→MT4だったらインデックステンプレート作った方がスマートですよね。

phpMyAdminとにらめっこ、ってのは気持ちとしてはわかるのですが「まっさら」とは矛盾しちゃうような気がしますねぇ...

コメントする

Facebook

Twitter

このブログ記事について

このページは、Junnama Nodaが2007年8月22日 14:16に書いたブログ記事です。

ひとつ前のブログ記事は「MacBook+MAMP+Movable Type4。」です。

次のブログ記事は「Movable Type4で「年度別」アーカイブ。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6