エントリーのない親カテゴリーに子カテゴリーを表示する
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 タグの記述変更)。
- Movable Type6で記事のない親カテゴリのカテゴリページを出力する方法
- Movable Typeでブログ記事が属するカテゴリアーカイブのリンクをブログ記事ページに表示する
- Movable Typeで「カテゴリ+年別」の記事一覧を表示する方法
- Movable Typeで親カテゴリーアーカイブに表示した記事のメインカテゴリまでのパンくずリストを表示する
- Movable Typeのカテゴリのベースネームについて
- Movable Typeで複数ブログのブログ記事を同名のカテゴリ別に振り分ける方法
- Movable TypeのMTIfCategoryタグとMTEntryIfCategoryタグの違い
- Movable Typeのカテゴリリストで階層別に背景画像を変更する
- Movable Typeのカテゴリ・フォルダで特定の最上位階層を表示しない方法
- Movable Typeのカテゴリリストにダミーの親カテゴリを表示する
- MTEntriesタグのcategoryモディファイアに「AND」を含むカテゴリを指定する
- ブログ記事ページに自分が属するカテゴリのツリーと直属カテゴリの他のブログ記事一覧を表示する
- Movable Type 5でのMTEntriesタグのcategory/catgoriesモディファイアの動作改善について
- 親カテゴリーアーカイブにサブカテゴリーのブログ記事を表示する場合に特定のサブカテゴリーのブログ記事をフィルタリングする
- 特定のカテゴリのブログ記事を表示する
≫ 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さん
ご連絡ありがとうございました。
また何かございましたらご連絡ください。
ではでは!