Movable Typeのパンくずリストでフォルダの代わりにウェブページを表示する
Movable Typeのウェブページのパンくずリストで、フォルダの代わりにウェブページを表示するカスタマイズを紹介します。
変更前

変更後

上記のサンプルで使っているウェブページとフォルダの関係は次の通りです。
| ウェブページタイトル | 属するフォルダ |
|---|---|
| 親ウェブぺージ | 親フォルダ |
| 子ウェブぺージ | 子フォルダ |
| 孫ウェブぺージ | 孫フォルダ |
フォルダの階層は次の通りです。
親フォルダ
└ 子フォルダ
└ 孫フォルダ
1.カスタマイズ
次のサブテンプレートをウェブページテンプレートの任意の位置に設定します。
<$mt:FolderLabel setvar="folder"$>
<a href="<$mt:BlogURL$>">TOP</a> ≫
<mt:ParentFolders>
<$mt:FolderLabel setvar="current_folder">
<mt:if name="folder" ne="$current_folder">
<mt:Pages folder="$current_folder" include_subfolders="0">
<a href="<$mt:PagePermalink$>"><$mt:PageTitle$></a> ≫
</mt:Pages>
</mt:if>
</mt:ParentFolders>
<$mt:PageTitle$>
1行目で再構築中のウェブページのフォルダを変数folderに保存します。3行目でウェブページが属するフォルダの親フォルダから現在のフォルダまで処理を繰り返します。
4行目のMTFolderLabelタグで繰り返し処理の中のフォルダを変数current_folderに保存し、1行目で保存した変数folderと比較して、等しくない場合、つまり自フォルダでない場合のみMTifタグの中を実行します。
6行目のMTPagesタグにはfolderモディファイアで処理するフォルダを限定し、さらにinclude_subfoldersモディファイアでサブフォルダを処理しないように設定します。これで処理中のフォルダに属するウェブページの情報を出力します。
2.パンくずリストにフォルダを表示するサブテンプレート
参考までに、冒頭画面の変更前の、パンくずリストにフォルダを表示するサブテンプレートも掲載しておきます。
<mt:if tag="PageBaseName" eq="index">
<$mt:SetVar name="exclude_current" value="1"$>
<mt:else>
<$mt:SetVar name="exclude_current" value="0"$>
</mt:if>
<a href="<$mt:BlogURL$>">TOP</a> ≫
<mt:ParentFolders exclude_current="$exclude_current">
<a href="<$MTBlogURL$><$mt:FolderPath$>/"><$mt:FolderLabel></a> ≫
</mt:ParentFolders>
<$mt:PageTitle$>
パンくずリスト
「パンくずリスト」とは、現在表示しているページ位置を、上位(通常トップページ)からの階層構造で表わすもので、童話「ヘンゼルとグレーテル」で、森の中で迷わないよう目印としてパンくずを落としながら歩いたということから命名されたようです。当サイトでもトップページを除いた全てのページの中央カラム上部に表示しています。
ということで、Movable Typeでのカスタマイズ方法をご紹介します。
1.仕様
ここで紹介するパンくずリストは下記の仕様となっています(大袈裟ですが)。
- トップページをリンク表示します
- 現在のページタイトルをテキストで表示します
- 階層途中のカテゴリーにエントリーが存在する場合、該当のカテゴリーをリンク表示にします
- 階層途中のカテゴリーにエントリーが存在しない場合、該当のカテゴリーをテキスト表示にします
また、個別エントリーアーカイブは必ずあるひとつのカテゴリーに属していることが前提となります。Movable Type はサブカテゴリーをサポートしているので、階層構造を表示するアーカイブとしてはカテゴリーアーカイブ、および個別エントリーアーカイブがより適しているでしょう。
2.カテゴリーアーカイブに追加する
パンくずリストとなる、下記のリストをカテゴリーアーカイブの任意の位置に貼り付けてください。
<a href="<$MTBlogURL$>">Top</a> > <MTParentCategories glue=" > ">
<MTIfNonZero tag="MTCategoryCount">
<?php
if ('<$MTCategoryLabel encode_php="q"$>' != '<$MTArchiveTitle encode_php="q"$>') {
print '<a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel encode_php="q"$></a>';
} else {
print '<$MTCategoryLabel encode_php="q"$>';
}
?>
<MTElse><$MTCategoryLabel$></MTElse></MTIfNonZero>
</MTParentCategories>
いくつかのサイトを参考にさせて頂きまして、カテゴリーアーカイブのパンくずリストにはMTタグとPHPを併用することにしました(MTタグだけでは仕様を満足できないため)。したがってカテゴリーアーカイブファイルの拡張子が .php になっていることが前提となります。PHPへの変更方法はPHPモジュール化の仕組みについて(その3:変更方法)の1.2項を参照ください。
リストの具体的な動作は、まず <MTParentCategories> ? </MTParentCategories> で現在のカテゴリー(カレントカテゴリー)を含めた全ての親カテゴリーを順番に表示します。glue 属性には区切り文字を設定します。ここでは「>(「>」)」とその前後に半角空白を設定していますが、他の文字に変更されても問題ありません。なお MTParentCategories の他のオプションとして exclude_current 属性があり、これを用いることでカレントカテゴリーを含めない表示も可能です。
MTParentCategories タグで括られた中では、カレントカテゴリーがアーカイブタイトルと等しいか、あるいはカテゴリーにエントリーが存在しない場合、テキスト表示にし、それ以外の場合はリンク表示にする処理を行っています。
前述の glue 属性以外で一ヶ所現れる「>」 はトップページと最上位カテゴリーの区切り文字として用いています。
3.個別エントリーアーカイブに追加する
下記のリストを個別エントリーアーカイブテンプレートの任意の位置に貼り付けてください。
<a href="<$MTBlogURL$>">Top</a> >
<MTParentCategories glue=" > ">
<MTIfNonZero tag="MTCategoryCount">
<a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a>
<MTElse><$MTCategoryLabel$></MTElse>
</MTIfNonZero>
</MTParentCategories>
> <$MTEntryTitle$>
構造はカテゴリーアーカイブのパンくずリストに似ていますが、階層表示の最後はエントリーのタイトルになります。つまりカテゴリーアーカイブのように最後の階層をテキスト表示にするための判定が不要なため、MTタグのみで構成しています。
エントリーが存在しないカテゴリーをテキスト表示にするという振る舞いはカテゴリーアーカイブと同様です。
4.日付アーカイブに追加する
下記のリストを日付アーカイブテンプレートの任意の位置に貼り付けてください。トップページから1階層しかないため、簡素な構成です。
<a href="<$MTBlogURL$>">Top</a> > <$MTArchiveTitle$>
以上です。
参考サイトは下記です。ありがとうございました。
The Blog of H.Fujimoto:エントリーのカテゴリーをトップレベルから順に表示する
hxxk.jp:サブカテゴリとパンくずリスト/サブカテゴリとパンくずリスト (2)
やむやむ:個別エントリにパンくずナビ
