印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType アーカイブの PHP 化の仕様を変更

日別,月別アーカイブの PHP 化は問題なく動作しているのではあるが,仕様を変更することにした。

■ ■ ■

新しい仕様

記事の再構築時間を短縮するために,アーカイブを一部 PHP 化してきた。日別(nlog(n): 長年日記を PHP で実装する),月別(nlog(n): 月別アーカイブを PHP で表示する)共に上手くいっている。「ならば次はカテゴリアーカイブだ」と意気込んだが,不可能なことが判明。設計ミスである。そこで,仕様を変更することにした。ただし,日別,月別の PHP のコードは変更なしでそのまま使える(実はそのまま使えるようにちょと直した)。

今までは,ファイル名の形式を「abstract/YYYY_MM_DD.html」にして,アーカイブの種類としては「Daily」にしていたが,これを次のように変更する。

ファイル名の形式 abstract/YYYY_MM_DD_nnnnnn_Category_.html
YYYY_MM_DD 年月日 (YYYYは4桁の年,MMは2桁の月,DDは2桁の日)
nnnnnn 6桁の記事番号 (桁数が6桁に満たない場合は「0」でパディングする)
Category カテゴリ名 (複数ある場合はアンダースコア「_」でつないで並べる)
アーカイブの種類 Individual

PHP を使ってカテゴリアーカイブに表示するには,ファイル名にカテゴリが入っていなければならない。しかし,日付にカテゴリをつけただけでは,同じ日に同じカテゴリの記事を書いたときに衝突が起こってしまう。衝突しないようにするには,記事番号を入れる必要がある。日付でソートするので,記事番号は日付より後でなければならない。ということで,上のような形式になった。

アーカイブテンプレートの作成と登録

アーカイブに関連したテンプレートを新たに作り,テンプレート名を例えば「Individual Entry Archive Abstract」にする。内容は,もとの「Individual Entry Archive」の <Entries>〜</Entries> 部分のみである。ただし,最初の <Entries> と最後の </Entries> は削除しておくことが重要。これがあると,全ての記事が1つのファイルに出力されてしまう。

blogbody の div には次のように書いておくというのは同じである。

<div class="blogbody <$MTEntryDate format="year%Y"$>">

テンプレートの追加が終わったら,アーカイブの設定を行う。「ブログの設定」→「アーカイブの設定」でアーカイブを新しく追加し,アーカイブの種類を「Individual」にする。各記事毎にファイルを出力するからだ。アーカイブファイルのテンプレート欄には,次のように書いておく。

abstract/<$MTArchiveDate format="%Y_%m_%d"$>_<$MTEntryID pad="1"$>_<MTEntryCategories><$MTCategoryLabel encode_url="1"$>_</MTEntryCategories>.html

「こんなのは初めて見たよ」くらい長い。カテゴリが複数ある場合にも対応している。カテゴリは encode_url を通しているので,カテゴリ名に空白がある場合は「%20」に変換される。ちなみに,Movable Type 2.661 のカテゴリアーカイブのファイル名は dirify フィルタを通して生成されてているので,空白は「_」に,大文字は小文字に変換される。上記で dirify ではなく encode_url を使ったのは,dirify では空白もアンダースコアもどちらもアンダースコア「_」に変換されてしまうからである。まあ,この辺は趣味の問題でもある。

以上で完了である。個別記事を全て再構築すれば,abstract ディレクトリ以下にファイルが生成される。日別アーカイブと月別アーカイブの PHP のコードはそのままでよい。

前のカスタマイズを行っている場合

もし,nlog(n): 長年日記を PHP で実装する にしたがってファイルを生成している場合は,次のことを行う必要がある。

  1. アーカイブの設定から,「Daily Archive Abstract」を削除
  2. テンプレートから,「Daily Archive Abstract」を削除 (これはあっても害はないが,不要なので)
  3. abstract ディレクトリ以下のファイルを一旦すべて削除

注意点

ファイルを生成して,PHP で動的に読み込んで表示する方法には注意点がある。一旦公開してから,日付を変更すると,変更前のファイルは削除されずに新たにファイルが生成されるため,日付だけが違うファイルが2つ出来てしまう。カテゴリを変更した場合も同様である。日付やカテゴリを変更した場合は,古いファイルを手で削除する必要がある。

Linux なら,次のコマンドで重複ファイルを見つけることができる。

$ cd abstract
$ ls -1 | uniq -D --skip-chars=11 --check-chars=6

uniq には,最初の11文字をスキップし,続く6文字を比較の対象とし,重複行をすべて表示するオプションをつけている(Manpage of UNIQ)。

Posted by n at 2007-04-06 01:59 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?