ブログ記事のない親カテゴリーに子カテゴリーのブログ記事を表示する(Movable Type 4.25~)

ブログ記事のない親カテゴリーに子カテゴリーのブログ記事を表示する(Movable Type 4.25~)

Posted at July 28,2009 1:23 AM
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 で確認したところ、子カテゴリーのブログ記事投稿時に親カテゴリーアーカイブは再構築されません。したがって、下記のプラグインを併用されることをおすすめします。

Junnama Online (Mirror) - サブカテゴリーのエントリー投稿時に親カテゴリーアーカイブを再構築するプラグイン
関連記事
zenback
人気エントリー
トラックバックURL


コメント

こんばんは、yujiroさん。
ちょっと確認したいのですが、「4.子カテゴリーのブログ記事投稿時に親カテゴリーアーカイブを再構築する」で紹介している junnamaさんのプラグイン、MT4.26以降で動作していますか?
私の処ではMT4.23からMT4.26へのアップグレード後に、エラーログを吐いて動作しなくなってるようなんです。
もし動いてるようなら、もう一度色々見直そうと思います。

[1] Posted by oscar logo : July 31, 2009 11:26 PM

>oscarさん
こんばんはー。
ご質問の件ですが、プラグインは動作することを確認してから掲載したので、動作しています。
ちなみに、4.261で確認し、特にエラーログも出ていないようです。
それではよろしくお願い致します。

[2] Posted by yujiro logo : August 1, 2009 3:46 AM

こんにちは
いつもお世話になります。

さて、当カスタマイズを実行してみました。
親カテゴリへの記事数表示はうまくいきましたが、親カテゴリをクリックしても、「カテゴリ月別アーカイブリスト」の表示がされません。
サイドタイトルのみの表示です。
子カテゴリは正常に表示されます。

例によって、私のポカかもしれませんが、お時間のある時にでも検証していただけませんでしょうか。
お願い致します。

[3] Posted by やまだ : August 7, 2009 9:58 AM

追記です

親カテゴリーからリストを表示した場合、「最近のエントリー」「最近のコメント」も表示されません。

[4] Posted by やまだ : August 7, 2009 5:17 PM
コメントする
greeting

*必須

*必須(非表示)


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

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

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

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