エントリー本文
特定のカテゴリーに属するブログ記事一覧を表示する(改)
Movable Type で、特定のカテゴリーに属するブログ記事一覧を表示するカスタマイズです。
MTEntries タグに category モディファイアを適用するだけでは適正に取得できないケースを、テンプレートタグのカスタマイズによって実現します。
1.MTEntries タグの category/categories モディファイアについて
MTEntries タグには category/categories モディファイアがあり、モディファイアに指定したカテゴリーのブログ記事を取得できます。
ただし、次のようなカテゴリーで、トップカテゴリーの「お知らせ」カテゴリーだけに属するブログ記事を抽出したいと仮定します。
・お知らせ
・イベントA
└ お知らせ
・イベントB
└ お知らせ
この場合、次のテンプレートタグでは、イベントAやイベントBの「お知らせ」カテゴリーに属するブログ記事も対象になってしまいます。
<mt:entries category="お知らせ">
...中略...
</mt:entries>
具体例として、前述の各「お知らせ」カテゴリーに次のブログ記事が属しているとします(●印)。
・お知らせ
●モバイルサイトオープン
●業務提携に関するお知らせ
・イベントA
└ お知らせ
●ソリューションセミナー
●Movable Type 入門セミナー
・イベントB
└ お知らせ
●オフィシャルサイトオープン
●シンポジウム2008
●ホームページリニューアル
サイドバーに表示する「最近のブログ記事」の MTEntries タグに category モディファイアを適用して「お知らせ」を設定すると、次のように表示されます。

余談ですが、イベントAの「お知らせ」カテゴリーに属するブログ記事を抽出したい場合、次のように指定しても、適正に取得できないようです。
<mt:entries category="イベントA/お知らせ">
...中略...
</mt:entries>
2.動作確認バージョン
このカスタマイズは次のバージョンで確認しています。
- Movable Type 4.2x(~4.23)
3.カスタマイズ
サイドバーに設置する場合、次のサブテンプレートを利用してください。
デフォルトテンプレート用
<mt:setVar name="category" value="取得したいブログ記事のカテゴリ名" />
<mt:if tag="blogEntryCount">
<div class="widget-recent-entries widget-archives widget">
<h3 class="widget-header">最近のブログ記事</h3>
<div class="widget-content">
<ul>
</mt:if>
<mt:entries category="$category">
<mt:setVar name="undef(list)" />
<mt:setVar name="count" value="0" />
<mt:entryCategories>
<mt:setVarBlock name="list" index="$count"><mt:parentCategories glue="/"><mt:categoryLabel /></mt:parentCategories></mt:setVarBlock>
<mt:setVar name="count" op="++" />
</mt:entryCategories>
<mt:setVar name="category_flag" value="0" />
<mt:loop name="list">
<mt:if name="__value__" eq="$category">
<mt:setVar name="category_flag" value="1" />
</mt:if>
</mt:loop>
<mt:if name="category_flag">
<li><a href="<mt:entryPermalink escape="html" valid_html="1">"><mt:entryTitle /></a></li>
</mt:if>
</mt:entries>
<mt:if tag="blogEntryCount">
</ul>
</div>
</div>
</mt:if>
小粋空間テンプレート用
<mt:setVar name="category" value="取得したいブログ記事のカテゴリ名" />
<mt:if tag="blogEntryCount">
<dt class="sidetitle">最近のブログ記事</dt>
<dd class="side">
<ul>
</mt:if>
<mt:entries category="$category">
<mt:setVar name="undef(list)" />
<mt:setVar name="count" value="0" />
<mt:entryCategories>
<mt:setVarBlock name="list" index="$count"><mt:parentCategories glue="/"><mt:categoryLabel /></mt:parentCategories></mt:setVarBlock>
<mt:setVar name="count" op="++" />
</mt:entryCategories>
<mt:setVar name="category_flag" value="0" />
<mt:loop name="list">
<mt:if name="__value__" eq="$category">
<mt:setVar name="category_flag" value="1" />
</mt:if>
</mt:loop>
<mt:if name="category_flag">
<li><a href="<mt:entryPermalink escape="html" valid_html="1">"><mt:entryTitle /></a></li>
</mt:if>
</mt:entries>
<mt:if tag="blogEntryCount">
</ul>
</dd>
</mt:if>
このサブテンプレートを利用することで、先のサンプルを次のように表示させることができます。

4.サブテンプレートの解説
上記のサブテンプレートについて、必要な部分のみ抜粋して解説します。
01:<mt:setVar name="category" value="取得したいブログ記事のカテゴリ名" />
02:<mt:if tag="blogEntryCount">
03:<ul>
04:</mt:if>
05:<mt:entries category="$category">
06: <mt:setVar name="undef(list)" />
07: <mt:setVar name="count" value="0" />
08: <mt:entryCategories>
09: <mt:setVarBlock name="list" index="$count"><mt:parentCategories glue="/"><mt:categoryLabel /></mt:parentCategories></mt:setVarBlock>
10: <mt:setVar name="count" op="++" />
11: </mt:entryCategories>
12: <mt:setVar name="category_flag" value="0" />
13: <mt:loop name="list">
14: <mt:if name="__value__" eq="$category">
15: <mt:setVar name="category_flag" value="1" />
16: </mt:if>
17: </mt:loop>
18: <mt:if name="category_flag">
19: <li><a href="<mt:entryPermalink escape="html" valid_html="1">"><mt:entryTitle /></a></li>
20: </mt:if>
21:</mt:entries>
22:<mt:if tag="blogEntryCount">
23:</ul>
24:</mt:if>
1行目の value モディファイアの値(赤色部分)に抽出したいカテゴリー名を設定します。冒頭のカテゴリー一覧から「お知らせ」を抽出したい場合は次のように記述します。
<mt:setVar name="category" value="お知らせ" />
サブカテゴリーを指定したい場合は、カテゴリーの区切り文字を "/" にします。例えば冒頭のカテゴリー一覧からイベントAの「お知らせ」を抽出したい場合は、次のように設定します。
<mt:setVar name="category" value="イベントA/お知らせ" />
2~4行目の MTIf タグで ul 要素の開始タグを出力します。また、22~24行目の MTIf タグで ul 要素の終了タグを出力します。
<mt:if tag="blogEntryCount">
<ul>
</mt:if>
...中略...
<mt:if tag="blogEntryCount">
</ul>
</mt:if>
本来は MTEntries タグ内に MTEntriesHeader タグ・MTEntriesFooter タグを使用して、初回の繰り返しで ul 要素の開始タグ、繰り返しの最後で ul 要素の終了タグを出力するのですが、このサブテンプレートでは MTEntriesFooter タグが正常に動作せず、初回のブログ記事の処理で実行されてしまいます。原因は MTEntries タグの中で色々なテンプレートタグを使っていて、 MTEntriesFooter タグを判定するデータが上書きされてしまっていると推測します。したがってMTEntriesFooter タグは使用せず、MTEntries タグの外側でMTIf タグで ul 要素の終了タグを出力します。それに併せて、MTEntriesHeader タグも使用していない、ということです。
5行目~21行目で MTEntries タグのループがあります。category モディファイアには、1行目で設定した変数 category を設定します。
<mt:entries category="$category">
...中略...
</mt:entries>
6~7行目で利用する変数の初期化を行います。
<mt:setVar name="undef(list)" />
<mt:setVar name="count" value="0" />
配列変数 list は、ブログ記事に属するすべてのカテゴリ名を保持するもので、count は配列変数 list のインデックス用カウンタです。いずれも処理対象のブログ記事が切り替わった時点で初期化します。配列変数 list は初期化しないと、例えば前回の処理でインデックス値 3 まで設定され、今回の処理でインデックス値 2 までしか使われなかったら、前回のインデックス値 3 が処理対象となってしまいます。
なお、undef 関数の場合、MTSetVar タグでも value モディファイアの設定は不要です。
8~11行目で、あるブログ記事が属するすべてのカテゴリーを変数 list に保持します。
<mt:entryCategories>
<mt:setVarBlock name="list" index="$count"><mt:parentCategories glue="/"><mt:categoryLabel /></mt:parentCategories></mt:setVarBlock>
<mt:setVar name="count" op="++" />
</mt:entryCategories>
8行目の MTEntryCategories タグで、ブログ記事が属するすべてのカテゴリー分、繰り返し処理を行います。ブロック内でカテゴリー名を取得しますが、その時、さらに MTParentCategories タグを用いて、処理対象のカテゴリーについて、親カテゴリーからのすべてのカテゴリ名を取得します。親カテゴリーから現在のカテゴリーまでの区切り文字は glue モディファイアを使って "/" を与えます。10行目の MTSetVar タグでは、変数 count の値をインクリメントし、次のカテゴリーの処理のためにインデックス値を更新します。
12~17行目は、設定した配列変数 list に、1行目で設定したカテゴリー名と同じカテゴリー名があることをチェックします。
<mt:setVar name="category_flag" value="0" />
<mt:loop name="list">
<mt:if name="__value__" eq="$category">
<mt:setVar name="category_flag" value="1" />
</mt:if>
</mt:loop>
12行目はチェック処理で利用する変数 flag を初期化します。13~17行目の MTLoop タグで配列変数 list を指定し、14行目で配列変数の値 __value__ と変数 category を比較します。等しければ、変数 flag に 1 を設定します。
18~20行目で変数 flag を判定し、1であれば(=1行目の変数 category に設定したカテゴリーがブログ記事に設定されていれば)ブログ記事タイトルを出力します。
<mt:if name="category_flag">
<li><a href="<mt:entryPermalink escape="html" valid_html="1">"><mt:entryTitle /></a></li>
</mt:if>
- PowerEdit プラグイン v0.02
- Movable Type のカテゴリーリストで特定のカテゴリーを非表示にする
- 実験!Movable Typeラボラトリー
- ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版・改)
- 当ブログの検索フォームへの検索文字列設定方法について
- ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)
- カテゴリー・アーカイブのカテゴリーリストで該当カテゴリーのエントリーのみを表示する
- Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その1)
- プライベートタグで特定のブログ記事一覧を表示する
- テストデータを大量に作成する MTBooter プラグイン
- Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その2)
- Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その1)
- ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版・改)
- ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)
- 概要と本文を切り替える(Movable Type 4・デフォルトテンプレート版)
- Movable Type で画像挿入時の form 要素について
- 概要と本文を切り替える(公開テンプレート版)
- 概要と本文を切り替える(デフォルトテンプレート版)
- Movable Type で全エントリーを表示する方法
- Movable Type のエントリー削除でHTMLファイルも自動的に削除する
- Movable Type で blockquote 要素を記述する時の注意
- エントリー・アーカイブで親カテゴリーに含まれる全エントリーをサブカテゴリー別に表示
- エントリーの文字数を表示する
- エントリーの中でMTタグを使う
- エントリーにpタグとbrタグが入る仕組み(その3:textareaにbrタグを挿入しない)
- エントリーにpタグとbrタグが入る仕組み(その2:blockquoteにbrタグを挿入)
- エントリーにpタグとbrタグが入る仕組み(その1:コード解析)
≫ MT4.2以降で、特定カテゴリの記事リストを表示する方法 from エー・プラネット・ビズ
Movable Type (ムーバブル・タイプ) で特定カテゴリの記事リストを表示しようと思えば、MTEntriesタグを使って、下記のように設定するのが... [続きを読む]
表示する記事一覧の数を指定することはできますか?
