top

エントリーアーカイブに関連する記事一覧を表示する(2) 応用編

MT4が出た直後(去年の夏~秋)くらいに変数が使えるようになったのが面白くて、エントリーアーカイブに関連する記事一覧を表示するというのを覚え書きしたことがあります。が、当時書いたのはごくごく基本的でシンプルなタグ組みでした。もちろん細かいことを気にしなければこれで十分使えるのですが、「該当エントリーは関連記事一覧に出したくない」という細かい欲求に応えるにはもう一工夫必要になってくるのでちょっと考えてみました。

その際、最初に考えつくのは<$MTEntryID$>や<$MTEntryTitle$>で識別させ、関連記事リストから該当記事を除くことではないでしょうか。が、それをやると関連記事リストに該当記事があった場合、10件指定しても(該当記事が抜けるため)9件にしかならないとか、そのタグに所属する記事が該当記事しかなくてリストが空欄になった場合、空の<ul></ul>が残ってしまうとか、次々と問題?が出てきたりします。それに関してはいろいろ工夫されている記事もたくさんあります。

ti-web.net blog関連するエントリーへのリンク
mtde.info現在のエントリと同じタグのついた他エントリのリストアップ
Junnama Online (Mirror)MTSetVar(Block)/MTIfタグの具体的な利用例。

上記の記事を参考にさせていただきつつ、以下の条件で考えてみました。

  • 該当記事は除外(または何らかの方法で識別)する
  • リストに該当記事が含まれる・含まれないにかかわらず、常に指定した記事数を保つ
  • リストに記事がない場合、空の<ul></ul>を残さない
  • 4.1のダイナミック・パブリッシングで問題なく動く(__first__、__last__は使わない)


■該当記事はリンクを張らずに最新10件を表示する(4.0~)
記事そのものを外すのではなく、リンクを外す方法。これなら記事数の一定化や空の<ul></ul>については考慮しなくていいので、比較的簡単です。該当記事はEntryIDで識別しています。

<MTSetVarBlock name="thisid"><$MTEntryID$></MTSetVarBlock>
<MTEntryIfTagged>
<MTSetVarBlock name="etag"><MTEntryTags glue=" OR "><$MTTagName$></MTEntryTags></MTSetVarBlock>
<MTEntries lastn="10" tags="$etag">
<MTSetVarBlock name="eid"><$MTEntryID$></MTSetVarBlock>
<MTEntriesHeader><ul></MTEntriesHeader>
<MTIf name="eid" ne="$thisid">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
<MTElse>
<li class="thisentry"><$MTEntryTitle$></li>
</MTElse>
</MTIf>
<MTEntriesFooter></ul></MTEntriesFooter>
</MTEntries>
</MTEntryIfTagged>
.thisentry {
font-weight: bold;
}

この例では該当記事はスタイルシートで太字にしてますが、矢印やマークをつけるなどして好きに装飾できます。

■該当記事は除けて最新10件を表示する(4.1~)
本題。該当記事はリストから除外します。記事数は赤字の部分で指定します。

<MTSetVarBlock name="thisid"><$MTEntryID$></MTSetVarBlock>
<MTEntryIfTagged>
<MTSetVarBlock name="etag"><MTEntryTags glue=" OR "><$MTTagName$></MTEntryTags></MTSetVarBlock>
<MTSetvar name="taglistcount" value="0">
<MTEntries lastn="0" tags="$etag">
<MTEntriesHeader>
<MTSetVarBlock name="ecount"><$MTEntriesCount$></MTSetVarBlock>
</MTEntriesHeader>
<MTIf name="ecount" gt="1">
<MTEntriesHeader><ul></MTEntriesHeader>
<MTIf name="taglistcount" lt="10">
<MTSetVarBlock name="eid"><$MTEntryID$></MTSetVarBlock>
<MTIf name="thisid" ne="$eid">
<MTSetVar name="taglistcount" op="++">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTIf>
</MTIf>
<MTEntriesFooter></ul></MTEntriesFooter>
</MTIf>
</MTEntries>
</MTEntryIfTagged>

まず識別に使うために該当記事のEntryIDを取得。
次にこの記事のエントリータグに所属している記事のみを選抜。
次に<$MTEntriesCount$>で記事数を取得し、記事数が2以上ならリストを開始します(記事数が1の時は該当記事だけとみなす。これで空の<ul></ul>は出なくなる)。
次に各記事のEntryIDを取得し、該当記事のIDと比較することで該当記事をリストから除外します。
残された該当記事以外の記事に<MTSetVar name="taglistcount" op="++">でカウントを行います。 そしてカウントが10以下の記事のみを出力。カウントを開始する位置がポイントです。これで該当記事があるなしにかかわらず常に指定された記事数を保ちます。こだわり派に。