エントリーのない親カテゴリーに子カテゴリーを表示する
Category:[カテゴリー]
Tag:[Category, Customize, MovableType, MTEntriesWithSubCategories, MTIfCategory]
Movable Type 3.3 でエントリーのない親カテゴリーをアーカイブとして生成し、そこに子カテゴリーを表示するためのカスタマイズです。
Movable Type のカテゴリーアーカイブでは、自カテゴリーでエントリーがひとつも公開されていない場合、そのカテゴリーに子カテゴリーがある場合でも、自カテゴリーのアーカイブを生成することができません。言い換えると、エントリーのない親カテゴリーでの MTEntriesWithSubCategories タグは有効にならない、ということです。
本エントリーでは、下記の方法で親カテゴリーに子カテゴリーを表示する解決案を示してみたいと思います。
- 親カテゴリーにダミーのエントリーを作る
- メインページ、各アーカイブページで親カテゴリーのエントリーを表示しない設定をする
- サイドバーのエントリーリストがある場合も親カテゴリーのエントリーを表示しない設定をする
ただし、エントリーアーカイブの前後のエントリーへのリンクについては親カテゴリーが表示されてしまいますので、ここではそのリンクがないページ構造であることを前提にします。
また実験では親-子カテゴリーまでの動作しか確認しておりません(子カテゴリーに対しさらに子カテゴリーがある場合の動作は未確認です)ので、予めご了承ください。
1.MTEntries タグの変更(カテゴリーアーカイブ)
カテゴリーアーカイブの MTEntries タグ(リスト1.1)をリスト1.2 のタグに変更します。
<MTEntries> : [通常のMTタグ] : </MTEntries>- リスト1.1 カテゴリーアーカイブ(変更前)
<MTEntriesWithSubCategories> <MTIfCategory name="[除外したいカテゴリー]"> <MTElse> : [通常のMTタグ] : </MTElse> </MTIfCategory> </MTEntriesWithSubCategories>- リスト1.2 カテゴリーアーカイブ(変更後)
変更後の設定は、MTEntriesWithSubCategories タグでサブカテゴリーのエントリーも表示し、MTIfCategory タグで name 属性に記述されたカテゴリー、つまり親カテゴリーであれば何もしない(その他のカテゴリーであれば通常通り表示)という意味です。
たとえば、foo という親カテゴリーを除外したい場合は MTIfCategory タグの name 属性を
<MTIfCategory name="foo">- リスト1.3 name 属性設定例
とします。カテゴリー名は日本語でも大丈夫です。
除外したいカテゴリーが複数存在する場合、たとえば "foo" と "bar" という二つのカテゴリーを除外したい場合は、MTIfCategory タグを追加(リスト1.4の青色部分)して、
<MTEntriesWithSubCategories> <MTIfCategory name="foo"> <MTElse> <MTIfCategory name="bar"> <MTElse> : [通常のMTタグ] : </MTElse> </MTIfCategory> </MTElse> </MTIfCategory> </MTEntriesWithSubCategories>- リスト1.4 複数のカテゴリーを除外する方法
としてください。
2.MTEntries タグの変更(メインページ・日付アーカイブ・サイドバーの「最近のエントリー」等)
メインページ(アーカイブページも利用していれば含む)・日付アーカイブ・サイドバー等の MTEntries タグをリスト3.1 からリスト3.2 の内容に変更します。
<MTEntries> : [通常のMTタグ] : </MTEntries>- リスト3.1 メインページ・日付アーカイブ・サイドバー(変更前)
<MTEntries category_name="NOT [除外したいカテゴリー]"> : [通常のMTタグ] : </MTEntries>- リスト3.2 メインページ・日付アーカイブ・サイドバー(変更後)
たとえば、foo という親カテゴリーを除外したい場合は MTEntries タグの category_name 属性を
<MTEntries category="NOT foo">- リスト3.3 category 属性設定例1
とします。カテゴリー名は日本語でも大丈夫です。
除外したいカテゴリーが複数存在する場合、たとえば "foo" と "bar" という二つのカテゴリーを除外したい場合は OR で区切り、さらにカッコで括って、
<MTEntries category="NOT (foo OR bar)">- リスト3.4 category 属性設定例2
としてください。
3.親カテゴリーにダミーエントリーをひとつ作る
カスタマイズは3項までで完了です。あとは子カテゴリーを表示したい親カテゴリーにエントリーをひとつ作成して「公開」で保存してください。
これで子カテゴリーのエントリーを書いて再構築を実行し、各ページでの表示を確認してください。
2006.11.10 追記
Ogawa::memoranda さんのアドバイスを受けて、カスタマイズ内容を修正しました(パッチの削除&MTIfCategory タグの記述変更)。
- カテゴリーの階層別にデザインを切り替える for Movable Type 4
- カテゴリーリストの中に月別カテゴリーリストを表示する
- サブカテゴリーリストを定義型リストでマークアップする
- カテゴリーリストにカスタムフィールドの画像を表示する
- ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する
- カテゴリーアーカイブのサブカテゴリーリストに、親カテゴリーとその子カテゴリーを表示する
- ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版・改)
- Movable Type 4 でカテゴリー別にデザインを切り替える方法(その3)
- Movable Type 4 でカテゴリー別にデザインを切り替える方法(その2)
- Movable Type 4 でカテゴリー別にデザインを切り替える方法(その1)
- Movable Type 4 のカテゴリーアーカイブで全てのブログ記事を表示する
- dtree のサブカテゴリーリストにブログ記事タイトルを表示する for Movable Type
- Movable Type 4.1/MTOS のネイティブタグで dTree を実装する
- アーカイブページのリストの表示内容が異なる理由
- Movable Type 3 からのアップグレードによる「月別カテゴリーアーカイブ」の追加方法
- ブログ記事に同一カテゴリーのブログ記事リストを表示(MT4版)
- カテゴリー・アーカイブのカテゴリーリストで該当カテゴリーのエントリーのみを表示する
- カテゴリーリストにエントリータイトルを表示する
- dTree によるサブカテゴリーリスト for Movable Type
- サブカテゴリーリストのエクスプローラ風折りたたみ
≫ MTカスタマイズ:個別エントリーに関連記事を表示するプラグインMTTagInvoke from Dog*Walkキャバグロでゴー!
今まで「MTEntriesWithSubCategories」タグを使って、 &... [続きを読む]
yujiro さん、こんにちは!
今回のカスタマイズたのしみに待っておりました。
おかげさまで大変参考になりました。
いつもありがとうございます。
ContentHandlers.pmに当てているパッチ部分がよくないです。@namesに対して毎回同じ比較を行っています。書くのなら以下のようになりますね。
for (@names) {
return 1 if $cat->label eq $_;
}
また、以下のようにテンプレートを書けばこの改造は必要ないようにも思います。
<MTIfCategory name="[除外したいカテゴリー1]">
<MTElse>
<MTIfCategory name="[除外したいカテゴリー2]">
<MTElse>
:
[通常のMTタグ]
:
</MTElse>
</MTElse>
</MTIfCategory>
>takaさん
こんばんは。
ご連絡ありがとうございます。
記事公開が遅くなってすいませんでした。
>(o)さん
こんばんは。
アドバイスありがとうございました。
MTIFCategory が複数利用できるとは思いつきませんでした。
とり急ぎ、記事の方のみ先に修正させて頂きました。
遅くなりましたがこの場をお借りしてお礼申し上げます。
はじめまして。
いつも色々と参考にさせていただいてます。
ひとつ質問なんですが
カテゴリーアーカイブで親カテゴリー内に子カテゴリーのエントリーは表示出来たんですが、今度はそのエントリーごとのカテゴリー名を付けたいんですがすべて親カテゴリー名になってしまうんですが子カテゴリー名など区別して表示するにはどうすればいいでしょうか。
よろしくお願いします。
>yamaさん
こんにちは。
ご返事遅くなってすいません。
ご質問の件ですが、下記の MTEntryCategory タグではいかがでしょうか?
<a href="<$MTEntryLink archive_type="Category"$>"><$MTEntryCategory$></a>
リンクは省略しても構いません。
それではよろしくお願い致します。
ありがとうございました。
ちゃんと子カテゴリー名など区別して表示されました。
MTEntryCategoryでよかったなんて気付きませんでした。
欲を言ってもう一つ質問させてください。カテゴリーの説明の部分を区別して表示する方法ってありますか?
<$MTCategoryDescription$>
では親カテゴリーのものが表示されるだけで子カテゴリーのも区別して表示する方法があったら教えていただきたいのですが。
よろしくお願いします。
>yamaさん
こんにちは。
ご質問の件ですが、「[4]のコメントの質問と同じ場所に表示したい」ということであれば、今のところいいアイデアが思いつきません。
MTSubCategories で括られている、例えばサブカテゴリーリストで用いるのであれば表示は可能です。
それではよろしくお願い致します。
yujiroさんありがとうございます。
[4]のコメントと同じ場所に表示したかったんですがとりあえずカテゴリー名が表示出来たんで良かったです。
本当にありがとうございました。
>yamaさん
ご連絡ありがとうございました。
また何かございましたらご連絡ください。
ではでは!

