ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)
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">
- ブログ記事ページでその記事以外のブログ記事一覧を表示する方法
- 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版・改)
- 概要と本文を切り替える(Movable Type 4・デフォルトテンプレート版)
- Movable Type で画像挿入時の form 要素について
≫ 記事を小さく from 揚羽蝶のめも
少し居眠りをしておりましたぁ~。(笑)やる気満々でNostaleにINしようかと思ったらメンテナンスだったでし。しょうがないのでまたBLOGをいじっており... [続きを読む]
≫ from CoffeeTime
以前こちらで書いていたMT5にアップしたときに出るエラー。 その原因が分かった。 小粋空間: ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版... [続きを読む]
いつも見させていただいてます。
ひとつお聞きしたいのですが、
MT4でやっていますが、
トップページのサイドバーを全ページで共通化させるには
どのようにしたらよいのでしょうか?
テンプレートはデフォルトのままです。
どうかよろしくお願いいたします。
>佐藤さん
こんにちは。
ご質問の件につきましては、来週前半辺りに別途エントリー致します。
すいませんが少々お時間ください。
MTTagInvokeが機能していない事に気づき、慌てていたところです。
上記の方法をさっそく試してみたところ、別々の親カテゴリーの子カテゴリーに同名のMTEntryCategoryで表示されるカテゴリー名があるために、実際は別のカテゴリーにあるブログ記事も合わせて表示してしまい、困っています。
今更カテゴリー名を変更する事もできず、MTCategoryDescriptionも別に利用してしまっているため、思いつく方法がありません。
MTCategoryIDで選別できればいいんですが…
なにかいい方法はありませんでしょうか?
>footbrainさん
こんばんは。
ご要望の件、承りました。
ちなみにMTTagInvokeでもこのリストは出せませんね。
まず、MTCategoryIDを取得するプラグイン作ってから、リストを公開します。
それではよろしくお願い致します。
>footbrainさん
こんばんは。
ご連絡が遅くなりましたが、「ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版・改)」で公開しています。
それではよろしくお願い致します。
なぜか、これでタグを貼り付けても、
パーミッションエラーで再構築ができなくて困っております。
サーバの問題なのでしょうか?
助けていただけるとうれしいです。
>mizukagamiさん
こんにちは。
ご返事遅くなり申し訳ありません。
ご質問の件ですが、パーミッションエラーとは具体的にどのような事象になってますでしょうか。
また、タグをはずせばエラーは発生しないでしょうか?
詳細をご連絡頂ければ幸いです。
それではよろしくお願い致します。