ブログ記事のない親カテゴリーに子カテゴリーのブログ記事を表示する(Movable Type 4.25~)
Category:[カテゴリー]
Tag:[Category, Customize, MovableType, MTEntriesWithSubCategories]
ブログ記事のない親カテゴリーに子カテゴリーを表示する方法です。
下の画像は、ブログ記事が1件も投稿されていない「日記」カテゴリーのアーカイブページの状態です。ブログ記事は何も表示されておらず、メインページとアーカイブのリンクのみが表示されています。

カテゴリーアーカイブ一覧は次のようになっています。

この「日記」カテゴリーには子カテゴリーとして「お知らせ」「イベント」があり、テンプレートをカスタマイズすることで、次のように子カテゴリーのブログ記事を表示できるようになります。

カテゴリーアーカイブ一覧も次のようにリンクを表示し、親カテゴリー名の横に、子カテゴリーのブログ記事数を表示します。

これを初めてご覧になった方は特段たいした機能ではないように思われますが、Movable Type ではこれまで、この「ブログ記事のない親カテゴリーに子カテゴリーのブログ記事を表示する」という機能がありませんでした(厳密には一時期ありました)。
以下、これまでの経緯とカスタマイズについて紹介します。
1.概要とこれまでのバージョンでの動作
親カテゴリーのアーカイブページに子カテゴリーのブログ記事を表示するには、MTEntries タグの代わりに MTEntriesWithSubCategories タグを利用します。
しかし、Movable Type 3 の時代には、ブログ記事のない親カテゴリーのアーカイブページに MTEntriesWithSubCategories タグを利用しても子カテゴリーを表示することができず、「エントリーのない親カテゴリーに子カテゴリーを表示する」という記事を書きました。記事は、親カテゴリーにダミーのブログ記事を作り、その記事は MTIfCategory タグで表示しないようにカスタマイズするといった内容です。
その後、バージョン 4.1 で、ブログ記事のない親カテゴリーのアーカイブページに子カテゴリーを表示することができるようになりました(関連記事:MTEntriesWithSubCategories タグの不具合などについて)。
しかし、バージョン 4.2 になってから再び表示することができなくなったのですが、4.25 から動作するようになりました。確認したところ、4.2 以降では、MTEntriesWithSubCategories タグの有無にかかわらず、ブログ記事のない親カテゴリーについては、冒頭の画像のように空のアーカイブページが生成されます。
ということで、Movable Type 4.25 以降では、MTEntriesWithSubCategories タグを利用することで、ブログ記事のない親カテゴリーのアーカイブページでも、自然体で子カテゴリーのブログ記事を表示できるようになりました。
2.ブログ記事リストの変更
デフォルトテンプレートの場合、ブログ管理画面の「デザイン」→「テンプレート」→「カテゴリ別ブログ記事リスト」をクリックし、テンプレートにある MTEntries タグを MTEntriesWithSubCategories タグに書き換えます。
変更前
...前略...
<mt:Entries limit="$limit">
<mt:Ignore><!-- Use the Entry Summary module for each entry published on this page --></mt:Ignore>
<$mt:Include module="ブログ記事の概要"$>
</mt:Entries>
...後略...
変更後
...前略...
<mt:EntriesWithSubCategories limit="$limit">
<mt:Ignore><!-- Use the Entry Summary module for each entry published on this page --></mt:Ignore>
<$mt:Include module="ブログ記事の概要"$>
</mt:EntriesWithSubCategories>
...後略...
当ブログの配布テンプレートをご利用の場合は、ブログ管理画面の「デザイン」→「テンプレート」→「ブログ記事リスト」をクリックし、テンプレートにある MTEntries タグを MTEntriesWithSubCategories タグに書き換えます。
変更前
...前略...
<mt:if name="datebased_archive">
<mt:entries>
<mt:entryTrackbackData />
<mt:include module="ブログ記事の概要" />
</mt:entries>
<mt:else>
<mt:entries limit="auto">
<mt:entryTrackbackData />
<mt:include module="ブログ記事の概要" />
</mt:entries>
</mt:if>
...後略...
変更後
...前略...
<mt:if name="datebased_archive">
<mt:entries>
<mt:entryTrackbackData />
<mt:include module="ブログ記事の概要" />
</mt:entries>
<mt:else>
<mt:entriesWithSubCategories limit="auto">
<mt:entryTrackbackData />
<mt:include module="ブログ記事の概要" />
</mt:entriesWithSubCategories>
</mt:if>
...後略...
3.カテゴリアーカイブウィジェットの変更
2項の変更だけではカテゴリーリストに親カテゴリアーカイブページへのリンクが表示されません。理由は、デフォルトのサブテンプレートは MTCategoryCount タグを判定し、処理中のカテゴリーにブログ記事がない場合はリンクを表示しない制御を行なっているためです。
ここでは、制御タグを利用して、子カテゴリーのブログ記事がある場合はリンクを表示するようにします。また、カテゴリ名の横に子カテゴリのブログ記事も含めたブログ記事数を表示する変更も行います。
デフォルトテンプレートの場合、ブログ記事の「デザイン」→「ウィジェット」→「カテゴリアーカイブ」をクリックし、テンプレートの内容を次のように変更します(青色部分は追加、赤色部分は変更)。
<mt:IfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
<h3 class="widget-header">カテゴリ</h3>
<div class="widget-content">
<mt:TopLevelCategories>
<mt:SubCatIsFirst>
<ul>
</mt:SubCatIsFirst>
<mt:EntriesWithSubCategories>
<mt:EntriesFooter>
<mt:GetVar name="__counter__" setvar="entry_count" />
</mt:EntriesFooter>
</mt:EntriesWithSubCategories>
<mt:If name="entry_count">
<li><a href="<$mt:CategoryArchiveLink$>"<mt:If tag="CategoryDescription"> title="<$mt:CategoryDescription remove_html="1" encode_html="1"$>"</mt:If>><$mt:CategoryLabel$> (<mt:If tag="CategoryCount"><$mt:CategoryCount$><mt:Else><mt:GetVar name="entry_count" /></mt:If>)</a>
<mt:Else>
<li><$mt:CategoryLabel$>
</mt:If>
<$mt:SubCatsRecurse$>
</li>
<mt:SubCatIsLast>
</ul>
</mt:SubCatIsLast>
</mt:TopLevelCategories>
</div>
</div>
</mt:IfArchiveTypeEnabled>
当ブログの配布テンプレートをご利用の場合は、ブログ記事の「デザイン」→「ウィジェット」→「カテゴリアーカイブ」をクリックし、テンプレートの内容を次のように変更します(青色部分は追加、赤色部分は変更)。
<mt:ifArchiveTypeEnabled archive_type="Category">
<dt class="sidetitle">
Categories
</dt>
<dd class="side" id="categories">
<mt:topLevelCategories>
<mt:subCatIsFirst>
<ul>
</mt:subCatIsFirst>
<mt:entriesWithSubCategories>
<mt:entriesFooter>
<mt:getVar name="__counter__" setvar="entry_count" />
</mt:entriesFooter>
</mt:entriesWithSubCategories>
<mt:if name="entry_count">
<li><a href="<mt:categoryArchiveLink />" title="<mt:categoryDescription />"><mt:categoryLabel /></a> [<mt:if tag="CategoryCount"><mt:categoryCount /><mt:else><mt:getVar name="entry_count" /></mt:If>]
<mt:else>
<li><mt:categoryLabel />
</mt:if>
<mt:subCatsRecurse />
</li>
<mt:subCatIsLast>
</ul>
</mt:subCatIsLast>
</mt:topLevelCategories>
</dd>
</mt:ifArchiveTypeEnabled>
4.子カテゴリーのブログ記事投稿時に親カテゴリーアーカイブを再構築する
バージョン 4.261 で確認したところ、子カテゴリーのブログ記事投稿時に親カテゴリーアーカイブは再構築されません。したがって、下記のプラグインを併用されることをおすすめします。
- MTEntriesタグのcategoryモディファイアに「AND」を含むカテゴリを指定する
- ブログ記事ページに自分が属するカテゴリのツリーと直属カテゴリの他のブログ記事一覧を表示する
- Movable Type 5でのMTEntriesタグのcategory/catgoriesモディファイアの動作改善について
- 親カテゴリーアーカイブにサブカテゴリーのブログ記事を表示する場合に特定のサブカテゴリーのブログ記事をフィルタリングする
- 特定のカテゴリのブログ記事を表示する
- 親カテゴリページにサブカテゴリページのリンクを表示する
- Movable Type 5(MT5)のカテゴリ削除動作
- sort_method モディファイア(その2)
- sort_method モディファイア(その1)
- Movable Type でカテゴリ別にブログ記事の背景画像を切り替える(カスタムフィールド編)
- Movable Type でカテゴリ別にブログ記事の背景画像を切り替える
- 親カテゴリーアーカイブに表示したサブカテゴリーのブログ記事にサブカテゴリー名を表示する
- カテゴリーアーカイブページの最後に「続きを読む」のリンクを表示する
- Movable Type のカテゴリーリストで特定のカテゴリーを非表示にする
- dTree カテゴリーリストにブログ記事数を表示する
- カテゴリークラウド for Movable Type
- カテゴリーの階層別にデザインを切り替える for Movable Type 4
- カテゴリーリストの中に月別カテゴリーリストを表示する
- サブカテゴリーリストを定義型リストでマークアップする
- ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する
こんばんは、yujiroさん。
ちょっと確認したいのですが、「4.子カテゴリーのブログ記事投稿時に親カテゴリーアーカイブを再構築する」で紹介している junnamaさんのプラグイン、MT4.26以降で動作していますか?
私の処ではMT4.23からMT4.26へのアップグレード後に、エラーログを吐いて動作しなくなってるようなんです。
もし動いてるようなら、もう一度色々見直そうと思います。
>oscarさん
こんばんはー。
ご質問の件ですが、プラグインは動作することを確認してから掲載したので、動作しています。
ちなみに、4.261で確認し、特にエラーログも出ていないようです。
それではよろしくお願い致します。
こんにちは
いつもお世話になります。
さて、当カスタマイズを実行してみました。
親カテゴリへの記事数表示はうまくいきましたが、親カテゴリをクリックしても、「カテゴリ月別アーカイブリスト」の表示がされません。
サイドタイトルのみの表示です。
子カテゴリは正常に表示されます。
例によって、私のポカかもしれませんが、お時間のある時にでも検証していただけませんでしょうか。
お願い致します。
