趣味Web 小説 2005-02-04

Entry ID の値を Keyword の値として書き出す方法

Movable Type の Tips をひとつ。

かつて Movable Type における個別記事ファイル名のデフォルト設定は Entry ID を用いるものでした。書き損じたり、テストに用いたりした記事にも Entry ID は割り振られ、また同じデータベースを利用する全ウェブログについて横断的に付与されるわけです。

Entry ID は各記事がデータベースに格納された順番を示すデータです。各記事に関連付けられた Entry ID が同じになるようデータを移行するには、移転元におけるデータ入力の履歴を移転先で正確に再現する必要があります。「書き出し/読み込み」機能を利用すると、削除済記事が省略され、またウェブログ単位での出力となるため、テスト記事を削除したり複数のウェブログを管理しているケースではデータの入力履歴を再現できません。

独自ドメインを保有している場合、通常であればサーバを移転しても URI を維持できますが、 Entry ID をファイル名としてきた MT 利用サイトは、前記の問題のため移転に障害がありました。古い記事について MT による操作を二度と行わないのであれば、静的ファイルをサーバからダウンロードし、これをそのまま移転先のサーバへアップロードすればいい。でも、可能なら古い記事もデータベースに収録したいですよね。

今回ご紹介する Tips は、移転元において Entry ID をファイル名に使用している場合に、移転先におけるファイル名の維持と「読み込み」機能による簡単なデータ入力を両立させる方法です。とくに独自ドメインを保有している場合、各記事の URI を維持しつつサーバを移転する現実的な手段となります。

なお、肝心のアイデアは遊便局さんの記事のパクリです。お急ぎの方は遊便局さんの記事だけ読むことを勧めます。

この Tips は大きく3つの項目からなります。

  1. Movable Type 「書き出し」機能とほぼ同一の出力結果を得、Entry ID の値を Keyword の値として代入する記述を備えたテンプレート
  2. 前記テンプレートにより生成されたファイルを読み込むウェブログにおける、Keyword をファイル名とするアーカイブ設定
  3. 前記のテンプレートとアーカイブ設定によりファイル名の変化を防ぎ、さらに独自ドメインの保有により URI の維持継続に配慮したサーバ移転手順

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:
<$MTEntryKeywords$>
-----
<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>

そこで、これをコピーしまして、<$MTEntryKeywords$> を <$MTEntryBasename$> に書き換え、新しいインデックステンプレートとして追加してください。

あとは簡単。アーカイブの設定で適当なファイル名を設定し、サイト全体を「再構築」すると、keyword の値に MTEntryBasename の値が書き込まれた「書き出し」ファイルが手に入ります。これを FTP ツールか何かでサーバからダウンロードしてください。

移転先では、まず個別記事のファイル名を <$MTEntryKeywords$>.html などと設定しましょう。続いて先ほどのデータをアップロードし、「読み込み」を行います。サイトを「再構築」すれば、無事に移転完了。今後、新しく記事を追加する際には、忘れずに keyword を指定すること。

サーバの制限のため途中で作業が中断されてしまう場合には、月別アーカイブとして設定するとよいでしょう。ただしそのままではインポートが面倒くさいので、T_Chain でファイルを結合することを勧めます。なお移転先のサーバもプロセス制限が厳しい場合には、遊便局さんの記事を参考に CGI で毎月のログを自動で連続「読み込み」するとよいでしょう。

補記

私は長らく(かつての)デフォルト設定であるところの Entry ID を個別記事のファイル名に使用してきました。ファイル名を指定する手間なく、自動でダブりのないファイル名が決定されるので、私好みだったのです。しかし後から考えてみれば、これが大失敗。サーバを移転できなくなってしまったのでした。

この事実をきちんと認識したとき、私は既に百以上の記事を書いていました。賢い方々は、この問題をきちんと事前に検討し、Keyword または秒単位の時刻をファイル名に指定していました。最初にサボって後で苦労する、典型的なダメパターンに陥った私は、さらに解決の先延ばしを決め込み、とうとう記事数は1000を超えるに至るわけです。

「ファイル名なんて変化してもいいじゃない」というのが一番簡単な解決策なのですが、今すぐ移転の予定があるわけじゃなし、うまい逃げ道をじっくり考えることにしました。

私はタイトルと本文しかデータを入力してこなかったので、文字列を入力できる空欄が「追記」「概要」「キーワード」の3種類ありました。Entry ID をファイル名にされている方の大半は、これに似た状況だと思います。空欄には「追記」などの名前がついていますが、MT を簡易 CMS として用いる場合、それらの名前の意味は無視できます。データベースに空欄があるということが重要なんです。だから私は、Keyword 欄に Entry ID を代入して「書き出し」できないものか、と考えていました。(注:移転先ではファイル名に Keyword を使う)

しかし残念なことに、いくら考えても、具体的な方策には結実しませんでした。私は飽きて問題を放り出し、果報を寝て待ち続けたのでした。

関連記事

Information

注意書き