EntryIDを強引にKeywordsにする(2)

Last Updated:2006/3/05 18:07

MT3.2で確認してみたところ、このテンプレートは依然有効なようです。('06/02/25)

私がこのサイトでMTネタを扱うきっかけになったEntryIDを強引にKeywordsにする。
その時にも書いていますが、post+IDではないファイル名になる場合もあり、完全ではありませんでした。
その不具合を取り除いた最終版です。

もう需要はないだろうけど、そのままだと自分が気持ち悪いし。
不具合を取り除いたといってもMTのオリジナルソースから抜き出しただけですので、
なんら苦労したわけではありませんのです。。。

前回は、<$MTEntryID$>をKEYWORDS欄に入れましたが、
これではタイトルにアルファベットの含むエントリーだとエクスポート元とインポート先で異なってしまいます。
(デフォルトではアルファベットが含まれればそれを元にしたファイル名が付けられるはず。2バイト文字のみの場合にpost_IDとなる。)

その代わりに、<$MTEntryBasename$>というタグを使います。
これはMTにもとから用意されていたタグで、
ファイル名をカスタマイズして日付等にしていても、実は裏では各エントリーにpost_223とかの名前が付けられており、
その名前を呼び出す機能があります。

このタグをKEYWORDS欄に入れてやれば、インポート先のウェブログの設定で、
個別アーカイブのURIを<$MTEntryKeywords$>.htmlにすれば全く同じファイル名になり、.htaccessによるディレクトリでのリダイレクト等もスマートに出来る様になります。

詳しいやり方

月別アーカイブで月ごとにtxtで書き出し、それをまとめてインポートさせる方法です。

1. テンプレート作成

まず、アーカイブ・テンプレートに下のテンプレートを作成します。名前は適当に、ExportMonthlyとかなんとか。

(前回のテンプレートと異なりますが、今回のテンプレートは、MTが書き出しを行う際に用いるテンプレートそのままなので、こちらの方が意図した結果になると思います。
<$MTEntryBasename$>を<$MTEntryKeywords$>に変えれば、完全にMTの書き出しと同じ結果が得られます。)


<MTEntries>
AUTHOR: <$MTEntryAuthor strip_linefeeds="1"$>
TITLE: <$MTEntryTitle strip_linefeeds="1"$>
STATUS: <$MTEntryStatus strip_linefeeds="1"$>
ALLOW COMMENTS: <$MTEntryFlag flag="allow_comments"$>
CONVERT BREAKS: <$MTEntryFlag flag="convert_breaks"$>
ALLOW PINGS: <$MTEntryFlag flag="allow_pings"$>
<MTIfNonEmpty tag="MTEntryCategory">PRIMARY CATEGORY: <$MTEntryCategory$>
</MTIfNonEmpty><MTEntryCategories>
CATEGORY: <$MTCategoryLabel$>
</MTEntryCategories>
DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$>
-----
BODY:
<$MTEntryBody convert_breaks="0"$>
-----
EXTENDED BODY:
<$MTEntryMore convert_breaks="0"$>
-----
EXCERPT:
<$MTEntryExcerpt no_generate="1" convert_breaks="0"$>
-----
KEYWORDS:
<$MTEntryBasename$>
-----
<MTComments>
COMMENT:
AUTHOR: <$MTCommentAuthor strip_linefeeds="1"$>
EMAIL: <$MTCommentEmail strip_linefeeds="1"$>
IP: <$MTCommentIP strip_linefeeds="1"$>
URL: <$MTCommentURL strip_linefeeds="1"$>
DATE: <$MTCommentDate format="%m/%d/%Y %I:%M:%S %p"$>
<$MTCommentBody convert_breaks="0"$>
-----
</MTComments>
<MTPings>
PING:
TITLE: <$MTPingTitle strip_linefeeds="1"$>
URL: <$MTPingURL strip_linefeeds="1"$>
IP: <$MTPingIP strip_linefeeds="1"$>
BLOG NAME: <$MTPingBlogName strip_linefeeds="1"$>
DATE: <$MTPingDate format="%m/%d/%Y %I:%M:%S %p"$>
<$MTPingExcerpt$>
-----
</MTPings>
--------
</MTEntries>

もし、月別アーカイブを再構築するときに負荷が気になるならば、
AUTHOR、STATUS、ALLOW COMMENTS、CONVERT BREAKS、ALLOW PINGS
辺りに最初から値を入れてしまえばよいと思います。つまり、お好みで。

2. アーカイブの設定

次にアーカイブの設定で、上で作ったExportMonthlyを、月別アーカイブに関連付けます。

URIは(archives/)export/<$MTArchiveDate format="%y%m"$>.txtとします。
(先にexportフォルダを作成しておくこと)

そして、月別アーカイブを再構築すれば、無事に現ファイル名をEntryKeywordsにしたエクスポート完了です。

3. おまけ-月別にエクスポートしたファイルを1つにまとめる。

エクスポートし終わると、後はインポート先のMTで読み込むだけです。

もしそのサーバーのCGI制限が厳しいならば、1つずつ読み込ませたほうがよいかと思います。
が、1つずつアップロード+読み込みを繰り返すのが面倒くさい方のために。

プログラミング初心者の遊便局が頑張ってみました(笑。
でも、ご自身でフォローできる方のみご利用ください。
何かあっても遊便局は責任取れませんので…

次のスクリプトを、1行目を書き換えた上で、
mt-monthly-export.cgiなどと名前を付けて、exportフォルダに置き、実行してください。


#!/usr/Local/bin/perl
#↑の行をご自身の環境に合わせる。
#==================================================
#	mt-monthly-export.cgi
#	月別ログを、1ファイルにまとめてバックアップ。
#==================================================

use strict;

my $dir = './';

opendir(DIR, $dir) or die "Can't Open Directry.\n";

my @file = grep { /^\d{4}\.txt/ && -f "$dir/$_"} readdir(DIR);

my $fs = $file[0];
$fs =~ s/\.txt//ig;

my $fe = $file[$#file];
$fe =~ s/\.txt//ig;

my $fn = "export${fs}\-${fe}\.txt";

foreach (@file) {
	open(FILEIN, "$_") or die "Can't Open $_";
	my @line = <FILEIN>;
	close (FILEIN);

	open (FILEOUT, ">>./$fn") or die;
	print FILEOUT @line;
	close (FILEOUT);

	unlink $_;
}

closedir(DIR);

print "Content-Type: text/html;\n\n";
print "<b>$fnに保存しました。<br>必ずローカルに保存した後、exportディレクトリから削除してください。</b>";

exit;

実行後、exportYYMM-yymm.txtといったファイルがひとつ残ります。
YYMMが最も古いエントリーの年月(%y%m)で、yymmが最新のエントリーの年月になります。
バックアップを取るのにも使えるかな、と思いますです。

すごく雑なスクリプトなで、アクセス=実行ですので、注意してください。

以上、この件はこれにて終了!

Created On:2005/4/14 12:51