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

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

Posted at December 5,2008 1:55 AM
Tag:[Category, Customize, Entry, MovableType]

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>
関連記事
zenback
人気エントリー
トラックバックURL


トラックバック

MT4.2以降で、特定カテゴリの記事リストを表示する方法 from エー・プラネット・ビズ
Movable Type (ムーバブル・タイプ) で特定カテゴリの記事リストを表示しようと思えば、MTEntriesタグを使って、下記のように設定するのが... [続きを読む]

Tracked on February 2, 2009 5:01 PM

特定カテゴリのエントリーを表示させる。 from 備忘録
特定のカテゴリーを表示させようと思ったのですが、表示されたりされなかったりで意図... [続きを読む]

Tracked on November 20, 2009 3:11 PM

MT iPhone テンプレート完成? from 『超おむすび』
iPhoneテンプレートfor MT からカテゴリーで表示できるようにしてみた。 [続きを読む]

Tracked on April 22, 2010 8:03 AM
コメント

表示する記事一覧の数を指定することはできますか?

[1] Posted by serika : March 3, 2009 5:14 AM

>serikaさん
こんばんは。
ご質問の件ですが、テンプレートの中にある

<mt:entries ~

の部分を

<mt:entries lastn="10" ~

とすれば、記事を10件に絞ることができると思います。
それではよろしくお願い致します。

[2] Posted by yujiro logo : March 5, 2009 1:40 AM

いつも色々と参考にさせていただいてます。
コメントを書き込む場所が違うのですがご了承ください。

今回、質問したい内容は
「特定のカテゴリーのエントリーだけを昇順で表示する方法はありますか?」
というものです。
ブログ全体では降順でエントリーを表示するようにしていますが、特定のカテゴリーだけ昇順でエントリーを表示させたいのですが中途半端な知識でカスタマイズしているためにうまくいきません。
初歩的な事かも知れませんが上記のカスタマイズ方法があれば紹介をお願い致します。

[3] Posted by genki : April 20, 2010 9:15 PM

>genkiさん
こんばんは。
ご質問の件につきまして、記事をエントリーしましたのでご確認ください。

http://www.koikikukan.com/archives/2010/04/20-235555.php

それではよろしくお願い致します。

[4] Posted by yujiro logo : April 22, 2010 2:18 AM

ありがとうございます!yujiroさん!!
MTに関して困ったときはいつも参考にさせて頂き助かっているのに、自分のような未熟者の些細な質問にも対応していただき感謝です。
もっともっと勉強して実用的に使えるMT使用のホームページ作成に励みたいと思います。
これからも宜しくお願い致します。

[5] Posted by genki : May 12, 2010 10:38 PM

いつも大変お世話になっています。
<mt:Entries category="hogehoge">
のhogehogeが、英語表記で、andを含む場合で困っています。

hogehoge and hoge とすると、
hogehoge と hoge というカテゴリーだと解釈されてしまいます。。

これを、hogehoge and hoge という1つのカテゴリー名だと、
認識させるにはどうしたら、いいのでしょうか。。

いろいろ調べたのですが、わかりません(涙)。
困って困って、恥ずかしいのですがこちらに書き込ませて頂きます。
お知恵をお貸しください!!

[6] Posted by tomo : July 20, 2011 10:50 PM

>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」がそれぞれ独立したカテゴリとして認識されるようです。

より具体的な状況をお知らせいただければ同じ環境で実験できるかもしれません。
それではよろしくお願い致します。

[7] Posted by yujiro logo : July 21, 2011 9:52 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)