TopMovable Typeカスタマイズカテゴリー > 2008年12月
2008年12月 5日

特定のカテゴリーに属するブログ記事一覧を表示する(改)

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>
Comments [7] | Trackbacks [3]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3