特定のカテゴリーに属するブログ記事一覧を表示する(改)
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>
- ブログ記事ページでその記事以外のブログ記事一覧を表示する方法
- MTEntriesタグをテンプレートで複数使う時に記事を重複させない方法
- Movable Type5.2のTinyMCEを5.1のボタンに戻す方法
- Movable Typeで製品情報のテーブルを作る
- Movable Typeのブログ記事ページのファイル名に日別の通番を振る
- 予定日を過ぎたブログ記事を「最近のブログ記事」に表示しない
- mt-csv2customfields v0.03
- 複数ブログのブログ記事を時間順に1件ずつ表示する
- Movable Type のブログ記事にフラグメント識別子(ページ内リンク)を設定する
- Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その2)
- Movable Type 4 でカテゴリー別にブログ記事ページのデザインを切り替える方法(その1)
- ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版・改)
- ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)
- 概要と本文を切り替える(Movable Type 4・デフォルトテンプレート版)
- Movable Type で画像挿入時の form 要素について
≫ MT4.2以降で、特定カテゴリの記事リストを表示する方法 from エー・プラネット・ビズ
Movable Type (ムーバブル・タイプ) で特定カテゴリの記事リストを表示しようと思えば、MTEntriesタグを使って、下記のように設定するのが... [続きを読む]
≫ 特定カテゴリのエントリーを表示させる。 from 備忘録
特定のカテゴリーを表示させようと思ったのですが、表示されたりされなかったりで意図... [続きを読む]
≫ MT iPhone テンプレート完成? from 『超おむすび』
iPhoneテンプレートfor MT からカテゴリーで表示できるようにしてみた。 [続きを読む]
表示する記事一覧の数を指定することはできますか?
>serikaさん
こんばんは。
ご質問の件ですが、テンプレートの中にある
<mt:entries ~
の部分を
<mt:entries lastn="10" ~
とすれば、記事を10件に絞ることができると思います。
それではよろしくお願い致します。
いつも色々と参考にさせていただいてます。
コメントを書き込む場所が違うのですがご了承ください。
今回、質問したい内容は
「特定のカテゴリーのエントリーだけを昇順で表示する方法はありますか?」
というものです。
ブログ全体では降順でエントリーを表示するようにしていますが、特定のカテゴリーだけ昇順でエントリーを表示させたいのですが中途半端な知識でカスタマイズしているためにうまくいきません。
初歩的な事かも知れませんが上記のカスタマイズ方法があれば紹介をお願い致します。
>genkiさん
こんばんは。
ご質問の件につきまして、記事をエントリーしましたのでご確認ください。
http://www.koikikukan.com/archives/2010/04/20-235555.php
それではよろしくお願い致します。
ありがとうございます!yujiroさん!!
MTに関して困ったときはいつも参考にさせて頂き助かっているのに、自分のような未熟者の些細な質問にも対応していただき感謝です。
もっともっと勉強して実用的に使えるMT使用のホームページ作成に励みたいと思います。
これからも宜しくお願い致します。
いつも大変お世話になっています。
<mt:Entries category="hogehoge">
のhogehogeが、英語表記で、andを含む場合で困っています。
hogehoge and hoge とすると、
hogehoge と hoge というカテゴリーだと解釈されてしまいます。。
これを、hogehoge and hoge という1つのカテゴリー名だと、
認識させるにはどうしたら、いいのでしょうか。。
いろいろ調べたのですが、わかりません(涙)。
困って困って、恥ずかしいのですがこちらに書き込ませて頂きます。
お知恵をお貸しください!!
>tomoさん
こんばんは。
ご質問の件ですが、「hogehoge and hoge」というカテゴリをMTEntriesタグのcategoryモディファイアで認識させたい、という理解でよいでしょうか。
MT4.27/5.06/5.12で「hogehoge and hoge」というカテゴリに属するブログ記事を作成し、次の内容をインデックステンプレートに記述して動作確認したところ、「hogehoge and hoge」という文字列はカテゴリとして認識され、ブログ記事タイトルが表示されることを確認しました。
<mt:Entries category="hogehoge and hoge">
<mt:EntryTitle>
</mt:Entries>
なおcategoryモディファイアの内容を「hogehoge AND hoge」とすれば、大文字部分がカテゴリ名と不一致なため、「hogehoge」と「hoge」がそれぞれ独立したカテゴリとして認識されるようです。
より具体的な状況をお知らせいただければ同じ環境で実験できるかもしれません。
それではよろしくお願い致します。