ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)

ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)

Posted at November 27,2007 1:10 AM
Tag:[Category, Customize, Entry, MovableType]

Movable Type 4 で、ブログ記事アーカイブ(エントリーアーカイブ)に同一カテゴリーのブログ記事リスト(エントリーリスト)を表示するためのカスタマイズです。
質問を頂きましたので本エントリーにて解説致します。

Movable Type 3 までは、MTTagInvoke を使ったカスタマイズ「個別エントリーアーカイブに同一カテゴリーのエントリーを表示」が可能でしたが、Movable Type 4 ではこのプラグインが利用できなくなっています。

MT3 と同等のカスタマイズを行うには MTEntryCategoryEntries というプラグインがお勧めですが、ここでは、MTIf タグを使った方法を、順を追ってカスタマイズする形で紹介したいと思います。

読むのが面倒な方は、2項~4項のいずれかのサンプルを、そのままサイドバーに貼り付けてお使いください。

1.基本設定

ブログ記事に同一カテゴリーのブログ記事リストを表示する場合の基本形です。

<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>
 
<dt class="sidetitle">
Entries of this Category
</dt>
 
<dd class="side">
  <ul>
  <MTEntries category="$entrycategory">
    <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
  </MTEntries>
  </ul>
</dd>

1行目にある、

<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>

で、<$MTEntryCategory$> の評価内容を取得し、entrycategory という MT の変数に設定します。
そして、

<MTEntries category="$entrycategory">

で、先に設定した変数 entrycategory の値を用いてブログ記事リストを特定のカテゴリーでフィルタリングしています。MTGetVar の name 属性で変数を使用する場合は $ を付与しませんが(下)、

<MTGetVar name="entrycategory">

MTEntries タグの category 属性に用いる場合は、$ を付与して、MT の変数であることを明示します。

2.特定のアーカイブのみで表示させる

1項の状態では、サイドバーをインクルードする全てのページで表示されてしまうため、ブログ記事アーカイブのみにも適用されてしまいます。

このリストをブログ記事アーカイブだけに表示させるには、リスト全体 MTIf タグで括ります。

<MTIf name="entry_template">
<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>
 
<dt class="sidetitle">
Entries of this Category
</dt>
 
<dd class="side">
  <ul>
  <MTEntries category="$entrycategory">
    <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
  </MTEntries>
  </ul>
</dd>
</MTIf>

1行目の MTIf タグの name 属性には、ブログ記事のみで有効になる "entry_template" という値を設定します。

<MTIf name="entry_template">

これでブログ記事アーカイブ以外では、このリストは表示されなくなります。

アーカイブで使える変数値については、「予約変数一覧 for Movable Type 4(その1)」にまとめてありますので、参考になれば幸いです。

3.現在のブログ記事タイトルをリストから除外する

2項までの設定では、現在表示されているブログ記事のタイトルも表示されてしまうので、次にこれを非表示にする制御を行います。

非表示にするには、現在表示されているブログ記事ページのID番号と、リスティングされているブログ記事のID番号を比較・判定する処理(青色部分)を追加します。

<MTIf name="entry_template">
<MTSetVarBlock name="entryid"><$MTEntryID$></MTSetVarBlock>
<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>
 
<dt class="sidetitle">
Entries of this Category
</dt>
 
<dd class="side">
  <ul>
  <MTEntries category="$entrycategory">
  <MTSetVarBlock name="currententryid"><$MTEntryID$></MTSetVarBlock>
  <MTIf name="currententryid" ne="$entryid">
    <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
  </MTIf>
  </MTEntries>
  </ul>
</dd>
</MTIf>

現在表示されているブログ記事ページのID番号は、2行目の

<MTSetVarBlock name="entryid"><$MTEntryID$></MTSetVarBlock>

で取得し、リスティングされているブログ記事ページのID番号は、MTEntries タグブロック内の

<MTSetVarBlock name="currententryid"><$MTEntryID$></MTSetVarBlock>

で取得しています。これで、

entryid:現在表示されているブログ記事ページのID番号
currententryid:リスティングされているブログ記事ページのID番号

となり、あとはこれを MTIf タグで判定します。

<MTIf name="currententryid" ne="$entryid">

ne 属性で判定しているので、判定結果が「真」、つまりお互いのブログ記事IDが等しくなければ、MTIf ブロック内の行を実行します。

4.リストが1件の場合はリストを非表示にする

前項の設定を行った場合、あるカテゴリーに属するブログ記事が1件の場合、リストに何も表示されなくなってしまいます。
これを回避するため、カテゴリーに属するブログ記事が1件の場合は、リスト全体を非表示にする制御を行います。

<MTIf name="entry_template">
<MTSetVarBlock name="entryid"><$MTEntryID$></MTSetVarBlock>
<MTSetVarBlock name="entrycategory"><$MTEntryCategory$></MTSetVarBlock>
 
<MTEntries category="$entrycategory">
  <MTSetVarBlock name="entrycount"><$MTGetVar name="__counter__"$></MTSetVarBlock>
</MTEntries>
 
<MTUnless name="entrycount" eq="1">
<dt class="sidetitle">
Entries of this Category
</dt>
 
<dd class="side">
  <ul>
  <MTEntries category="$entrycategory">
  <MTSetVarBlock name="currententryid"><$MTEntryID$></MTSetVarBlock>
  <MTIf name="currententryid" ne="$entryid">
    <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
  </MTIf>
  </MTEntries>
  </ul>
</dd>
</MTUnless>
</MTIf>

該当カテゴリーのブログ記事数のカウントには、MTEntries タグ内で __counter__ を利用することで取得しています。
ところが、__counter__ という変数は、

<$MTGetVar name="entrycount" value="__counter__"$>

では正常に値を取得できない(変数値がそのまま変数名に設定されてしまう)ので、MTSetVarBlock と MTGetVar を組み合わせて、

<MTSetVarBlock name="entrycount"><$MTGetVar name="__counter__"$></MTSetVarBlock>

としています。

そして、MTUnless タグを用いて、カウント値が "1" でない場合にブロック内を実行するように制御します。

<MTUnless name="entrycount" eq="1">
関連記事
zenback
人気エントリー
トラックバックURL


トラックバック

記事を小さく from 揚羽蝶のめも
少し居眠りをしておりましたぁ~。(笑)やる気満々でNostaleにINしようかと思ったらメンテナンスだったでし。しょうがないのでまたBLOGをいじっており... [続きを読む]

Tracked on November 29, 2007 10:19 AM

from CoffeeTime
以前こちらで書いていたMT5にアップしたときに出るエラー。 その原因が分かった。 小粋空間: ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版... [続きを読む]

Tracked on December 7, 2009 6:31 PM
コメント

いつも見させていただいてます。
ひとつお聞きしたいのですが、
MT4でやっていますが、
トップページのサイドバーを全ページで共通化させるには
どのようにしたらよいのでしょうか?
テンプレートはデフォルトのままです。

どうかよろしくお願いいたします。

[1] Posted by 佐藤 : November 27, 2007 10:59 PM

>佐藤さん
こんにちは。
ご質問の件につきましては、来週前半辺りに別途エントリー致します。
すいませんが少々お時間ください。

[2] Posted by yujiro logo : November 29, 2007 10:22 AM

MTTagInvokeが機能していない事に気づき、慌てていたところです。

上記の方法をさっそく試してみたところ、別々の親カテゴリーの子カテゴリーに同名のMTEntryCategoryで表示されるカテゴリー名があるために、実際は別のカテゴリーにあるブログ記事も合わせて表示してしまい、困っています。

今更カテゴリー名を変更する事もできず、MTCategoryDescriptionも別に利用してしまっているため、思いつく方法がありません。

MTCategoryIDで選別できればいいんですが…

なにかいい方法はありませんでしょうか?

[3] Posted by footbrain logo : February 21, 2008 1:39 PM

>footbrainさん
こんばんは。
ご要望の件、承りました。
ちなみにMTTagInvokeでもこのリストは出せませんね。
まず、MTCategoryIDを取得するプラグイン作ってから、リストを公開します。
それではよろしくお願い致します。

[4] Posted by yujiro logo : February 24, 2008 12:54 AM

>yujiroさん

ありがとうございます。
リストの公開を楽しみにしています。

[5] Posted by footbrain logo : February 24, 2008 11:59 AM

>footbrainさん
こんばんは。
ご連絡が遅くなりましたが、「ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版・改)」で公開しています。
それではよろしくお願い致します。

[6] Posted by yujiro logo : February 27, 2008 12:03 AM

なぜか、これでタグを貼り付けても、
パーミッションエラーで再構築ができなくて困っております。

サーバの問題なのでしょうか?

助けていただけるとうれしいです。

[7] Posted by mizukagami : July 4, 2008 4:25 PM

>mizukagamiさん
こんにちは。
ご返事遅くなり申し訳ありません。
ご質問の件ですが、パーミッションエラーとは具体的にどのような事象になってますでしょうか。
また、タグをはずせばエラーは発生しないでしょうか?
詳細をご連絡頂ければ幸いです。
それではよろしくお願い致します。

[8] Posted by yujiro logo : July 14, 2008 12:56 PM
コメントする
greeting

*必須

*必須(非表示)


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

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

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

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