エントリーのない親カテゴリーに子カテゴリーを表示する

エントリーのない親カテゴリーに子カテゴリーを表示する

Posted at November 10,2006 12:50 AM
Tag:[Category, Customize, MovableType, MTEntriesWithSubCategories, MTIfCategory]

Movable Type 3.3 でエントリーのない親カテゴリーをアーカイブとして生成し、そこに子カテゴリーを表示するためのカスタマイズです。

Movable Type のカテゴリーアーカイブでは、自カテゴリーでエントリーがひとつも公開されていない場合、そのカテゴリーに子カテゴリーがある場合でも、自カテゴリーのアーカイブを生成することができません。言い換えると、エントリーのない親カテゴリーでの MTEntriesWithSubCategories タグは有効にならない、ということです。

本エントリーでは、下記の方法で親カテゴリーに子カテゴリーを表示する解決案を示してみたいと思います。

  • 親カテゴリーにダミーのエントリーを作る
  • メインページ、各アーカイブページで親カテゴリーのエントリーを表示しない設定をする
  • サイドバーのエントリーリストがある場合も親カテゴリーのエントリーを表示しない設定をする

ただし、エントリーアーカイブの前後のエントリーへのリンクについては親カテゴリーが表示されてしまいますので、ここではそのリンクがないページ構造であることを前提にします。
また実験では親-子カテゴリーまでの動作しか確認しておりません(子カテゴリーに対しさらに子カテゴリーがある場合の動作は未確認です)ので、予めご了承ください。

1.MTEntries タグの変更(カテゴリーアーカイブ)

カテゴリーアーカイブの MTEntries タグ(リスト1.1)をリスト1.2 のタグに変更します。

リスト1.1 カテゴリーアーカイブ(変更前)

<MTEntries>
   :
[通常のMTタグ]
   :
</MTEntries>

リスト1.2 カテゴリーアーカイブ(変更後)

<MTEntriesWithSubCategories>
<MTIfCategory name="[除外したいカテゴリー]">
<MTElse>
   :
[通常のMTタグ]
   :
</MTElse>
</MTIfCategory>
</MTEntriesWithSubCategories>

変更後の設定は、MTEntriesWithSubCategories タグでサブカテゴリーのエントリーも表示し、MTIfCategory タグで name 属性に記述されたカテゴリー、つまり親カテゴリーであれば何もしない(その他のカテゴリーであれば通常通り表示)という意味です。

たとえば、foo という親カテゴリーを除外したい場合は MTIfCategory タグの name 属性を

リスト1.3 name 属性設定例

<MTIfCategory name="foo">

とします。カテゴリー名は日本語でも大丈夫です。

除外したいカテゴリーが複数存在する場合、たとえば "foo" と "bar" という二つのカテゴリーを除外したい場合は、MTIfCategory タグを追加(リスト1.4の青色部分)して、

リスト1.4 複数のカテゴリーを除外する方法

<MTEntriesWithSubCategories>
<MTIfCategory name="foo">
<MTElse>
<MTIfCategory name="bar">
<MTElse>
   :
[通常のMTタグ]
   :
</MTElse>
</MTIfCategory>
</MTElse>
</MTIfCategory>
</MTEntriesWithSubCategories>

としてください。

2.MTEntries タグの変更(メインページ・日付アーカイブ・サイドバーの「最近のエントリー」等)

メインページ(アーカイブページも利用していれば含む)・日付アーカイブ・サイドバー等の MTEntries タグをリスト3.1 からリスト3.2 の内容に変更します。

リスト3.1 メインページ・日付アーカイブ・サイドバー(変更前)

<MTEntries>
   :
[通常のMTタグ]
   :
</MTEntries>

リスト3.2 メインページ・日付アーカイブ・サイドバー(変更後)

<MTEntries category_name="NOT [除外したいカテゴリー]">
   :
[通常のMTタグ]
   :
</MTEntries>

たとえば、foo という親カテゴリーを除外したい場合は MTEntries タグの category_name 属性を

リスト3.3 category 属性設定例1

<MTEntries category="NOT foo">

とします。カテゴリー名は日本語でも大丈夫です。

除外したいカテゴリーが複数存在する場合、たとえば "foo" と "bar" という二つのカテゴリーを除外したい場合は OR で区切り、さらにカッコで括って、

リスト3.4 category 属性設定例2

<MTEntries category="NOT (foo OR bar)">

としてください。

3.親カテゴリーにダミーエントリーをひとつ作る

カスタマイズは3項までで完了です。あとは子カテゴリーを表示したい親カテゴリーにエントリーをひとつ作成して「公開」で保存してください。

これで子カテゴリーのエントリーを書いて再構築を実行し、各ページでの表示を確認してください。

2006.11.10 追記
Ogawa::memoranda さんのアドバイスを受けて、カスタマイズ内容を修正しました(パッチの削除&MTIfCategory タグの記述変更)。

関連記事
zenback
人気エントリー
トラックバックURL


トラックバック

MTカスタマイズ:個別エントリーに関連記事を表示するプラグインMTTagInvoke from Dog*Walkキャバグロでゴー!
今まで「MTEntriesWithSubCategories」タグを使って、 ... [続きを読む]

Tracked on May 30, 2007 11:38 AM
コメント

yujiro さん、こんにちは!
今回のカスタマイズたのしみに待っておりました。
おかげさまで大変参考になりました。
いつもありがとうございます。

[1] Posted by taka : November 10, 2006 8:25 AM

ContentHandlers.pmに当てているパッチ部分がよくないです。@namesに対して毎回同じ比較を行っています。書くのなら以下のようになりますね。

for (@names) {
  return 1 if $cat->label eq $_;
}

また、以下のようにテンプレートを書けばこの改造は必要ないようにも思います。

<MTIfCategory name="[除外したいカテゴリー1]">
<MTElse>
<MTIfCategory name="[除外したいカテゴリー2]">
<MTElse>
   :
[通常のMTタグ]
   :
</MTElse>
</MTElse>
</MTIfCategory>

[2] Posted by (o) : November 10, 2006 1:53 PM

>takaさん
こんばんは。
ご連絡ありがとうございます。
記事公開が遅くなってすいませんでした。

>(o)さん
こんばんは。
アドバイスありがとうございました。
MTIFCategory が複数利用できるとは思いつきませんでした。

とり急ぎ、記事の方のみ先に修正させて頂きました。
遅くなりましたがこの場をお借りしてお礼申し上げます。

[3] Posted by yujiro : November 11, 2006 2:24 AM

はじめまして。
いつも色々と参考にさせていただいてます。
ひとつ質問なんですが
カテゴリーアーカイブで親カテゴリー内に子カテゴリーのエントリーは表示出来たんですが、今度はそのエントリーごとのカテゴリー名を付けたいんですがすべて親カテゴリー名になってしまうんですが子カテゴリー名など区別して表示するにはどうすればいいでしょうか。
よろしくお願いします。

[4] Posted by yama : November 20, 2006 10:22 AM

>yamaさん
こんにちは。
ご返事遅くなってすいません。
ご質問の件ですが、下記の MTEntryCategory タグではいかがでしょうか?

<a href="<$MTEntryLink archive_type="Category"$>"><$MTEntryCategory$></a>

リンクは省略しても構いません。
それではよろしくお願い致します。

[5] Posted by yujiro : November 22, 2006 12:18 PM

ありがとうございました。
ちゃんと子カテゴリー名など区別して表示されました。
MTEntryCategoryでよかったなんて気付きませんでした。

欲を言ってもう一つ質問させてください。カテゴリーの説明の部分を区別して表示する方法ってありますか?
<$MTCategoryDescription$>
では親カテゴリーのものが表示されるだけで子カテゴリーのも区別して表示する方法があったら教えていただきたいのですが。
よろしくお願いします。

[6] Posted by yama : November 24, 2006 5:43 AM

>yamaさん
こんにちは。
ご質問の件ですが、「[4]のコメントの質問と同じ場所に表示したい」ということであれば、今のところいいアイデアが思いつきません。
MTSubCategories で括られている、例えばサブカテゴリーリストで用いるのであれば表示は可能です。
それではよろしくお願い致します。

[7] Posted by yujiro : November 24, 2006 5:13 PM

yujiroさんありがとうございます。
[4]のコメントと同じ場所に表示したかったんですがとりあえずカテゴリー名が表示出来たんで良かったです。
本当にありがとうございました。

[8] Posted by yama : November 24, 2006 11:47 PM

>yamaさん
ご連絡ありがとうございました。
また何かございましたらご連絡ください。
ではでは!

[9] Posted by yujiro : November 26, 2006 9:41 PM
コメントする
greeting

*必須

*必須(非表示)


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

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

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

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