Nov 2, 2004

ダイナミック・パブリッシング時のカレンダーの不具合をアレする。

私自身は一ヶ月10エントリーが目標なのでカレンダーの表示はしていませんが、ダイナミックパブリッシングが可能になったおかげで、日別アーカイブを使うのも悪くないかなと思い始めています。

ところでMT3.11には、ダイナミックパブリッシング時のMTCalendarタグの中でMTEntryLinkタグなどを使うと不正なURLを返すというバグがあります。このエントリではこの問題点を回避する方法を述べます。

ついに抜本的な修正方法ができました!!

Ogawa::Buzz: Movable Type 3.11 日本語版・修正案の「MTArchiveLinkでarchive_typeオプションが無視される」と「MTEntryLink、MTEntryPermaLinkがアーカイブの設定によっては不正なURLを返す」がそれになります。

以下では「この修正方法を適用しないものとして」、問題点を回避する方法を述べます。

もう少し具体的な話をするために、カレンダーを生成するテンプレートを考えます。

<table class="calendar" summary="Calendar">
<tr class="calendar">
<td><$MTDate format="%B %Y"$></td>
 
<MTCalendar>
<td <MTCalendarIfToday>style="font-weight: bold"</MTCalendarIfToday>>
<MTCalendarIfEntries>
<MTEntries lastn="1">
<a href="<$MTEntryLink archive_type="Daily"$>"><$MTCalendarDay$></a>
</MTEntries>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank> </MTCalendarIfBlank>
</td>
</MTCalendar>
 
</tr>
</table>

…と、このようなテンプレートをよく見かけますが、こと日付アーカイブへのリンクを生成するだけであることを考えると、下のようなテンプレートにした方がよいでしょう。MTEntriesタグを使ってエントリーデータにアクセスする必要がないのでDBへのアクセスが減り、生成速度の改善が期待できます。

<MTCalendar>
<td <MTCalendarIfToday>style="font-weight: bold"</MTCalendarIfToday>>
<MTCalendarIfEntries>
<a href="<$MTArchiveLink archive_type="Daily"$>"><$MTCalendarDay$></a>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank> </MTCalendarIfBlank>
</td>
</MTCalendar>

さて、静的アーカイブの場合、上の2つの例ではいずれもエントリのある日付には「その日付のアーカイブ」へのリンクが生成されるはずです。が、これらのテンプレートをダイナミック・パブリッシングにすると、なぜか特定の日付のアーカイブへのリンクが生成されたり、日付アーカイブではなく月別アーカイブへのリンクが生成されたりする障害が発生します。また、日付アーカイブの代わりに月別アーカイブへのリンクを生成するようにしても同様の問題が発生します。

Ogawa::Buzz: Movable Type 3.11 日本語版・修正案で修正方法を述べていますが、こうした修正を施さないとすると何らかの回避手段を講じる必要があります。

ここで紹介するのは、直接日付アーカイブへのリンクを生成することで回避する方法です。

<MTCalendar>
<td <MTCalendarIfToday>style="font-weight: bold"</MTCalendarIfToday>>
<MTCalendarIfEntries>
<a href="<$MTBlogArchiveURL$><$MTCalendarDate format="%Y/%m/%d/index.html"$>">
<$MTCalendarDay$></a>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank> </MTCalendarIfBlank>
</td>
</MTCalendar>

また、MT3以前の形式のアーカイブを使っている場合には以下のように設定する必要があります。

<MTCalendar>
<td <MTCalendarIfToday>style="font-weight: bold"</MTCalendarIfToday>>
<MTCalendarIfEntries>
<a href="<$MTBlogArchiveURL$><$MTCalendarDate format="%Y_%m_%d.html"$>">
<$MTCalendarDay$></a>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank> </MTCalendarIfBlank>
</td>
</MTCalendar>

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com