サブカテゴリとパンくずリスト

http://hxxk.jp/2005/04/20/2323

記事データ

投稿者

望月真琴

投稿日時

2005-04-20T23:23+09:00

タグ
概要

Movable Type でパンくずリストを作るためのテンプレートの書き方を解説。

リプライ

4 件のリプライがあります。

記事本文

パンくずリストによる階層ナビゲーションを作る

まず、これから解説することに対する前提としてちょっと解説。

俗にパンくずリストと呼ばれるナビゲーションは、多くの場合サイトのトップページから現在のページまでのディレクトリ階層をそれぞれのディレクトリ毎にリンクを張って並べるものです。 これについては諸説あるかもしれませんが、それを論じることは今回の本論ではないのでまたいずれ。

今回の本論は、そのナビゲーションを Movable Type で効率よく作成する方法です。 パンくずリストを扱うなら、本当は link 要素の方でのナビゲーションも合わせて紹介したいところですが、今回は body 要素内でのナビゲーションのみを扱います。 MT 関連の質問スレッドあてに次のような質問が寄せられました。

MovableTypeでパンくずリストを作成したいのですが、1層目のサブカテゴリまでは何とか作ることができたのですが、2層目のサブカテゴリまで作成すると、パンくずリストが「ずれて」しまいます。

私がやりたかったのは、真琴さんの仰る通りのナビゲーションなんです。 しかし、その上で、個々のカテゴリへのリンクが張れるようにしたいのです。

私の考えるソース ver.1

<p>
<a href="<$MTBlogURL$>"><$MTBlogName$></a> &#62;
<MTParentCategories glue="&#62;" exclude_current="1"><a href="<$MTCategoryArchiveLink$>"><MTCategoryLabel></a>
</MTParentCategories>
&#62; <$MTArchiveTitle$>
</p>

ざっと考えてみましたが、こんな感じでどうでしょう ? このテンプレートで実際に展開される HTML は次のようになります。 なお、 http://hxxk.jp/mt/system/template/customize/ 上で展開したと仮定します。 カテゴリアーカイブ撤廃に伴い、現在はこのディレクトリは存在しません。

<p>
<a href="http://hxxk.jp/mt/">MT hxxks</a>
&#62; <a href="http://hxxk.jp/mt/system/index.php">system</a>
&#62; <a href="http://hxxk.jp/mt/system/template/index.php">template</a>
&#62; customize
</p>

このソースのポイントは、 MTParentCategories コンテナタグに exclude_current="1" を指定している点です。

exclude_current

「1」を設定するとリストから現在のカテゴリーを除く

こうすることにより、カレントカテゴリに対してはリンクを張らないようにできます。 カレントカテゴリにまでリンクを張りたい場合は、前述のテンプレートの強調部分を削除してください。

ただし、使い方に注意が必要

この方法だと自動でディレクトリごとのパンくずリストを作ることができますが、私はこの方法を採用していません。 当時採用しなかった理由とは、 「 / の後ろに index.php が付くのが嫌だった」 というものです。

これは少し本質と離れた理由ですが、実際には他の理由もあります。 <MTIfNonZero tag="MTCategoryCount"> の意外な落とし穴 - アーカイブ上で実際に展開される結果で述べましたが、その直下に記事を 1 件も持たないカテゴリの場合に不都合が出てきます。

記事を 1 件も持たないカテゴリの場合はカテゴリアーカイブが作成されず、パンくずリストで自動的にリンクを作ってしまうと 404 Not Found になってしまいます。 よって、 <MTIfNonZero tag="MTCategoryCount"> を活用して、存在しないディレクトリへのリンクを行わないようにすると良いでしょう。

私の考えるソース ver.2

<p>
<a href="<$MTBlogURL$>"><$MTBlogName$></a> &#62;
<MTParentCategories glue="&#62;" exclude_current="1">
  <MTIfNonZero tag="MTCategoryCount">
    <a href="<$MTCategoryArchiveLink$>"><MTCategoryLabel></a>
    <MTElse>
      <MTCategoryLabel>
    </MTElse>
  </MTIfNonZero>
</MTParentCategories>
&#62; <$MTArchiveTitle$>
</p>

このようにすると、記事を最低 1 件持つ ( = カテゴリアーカイブが生成される ) カテゴリのみにリンクが張られ、デッドリンクが作られてしまうことを防ぐことができます。 このテンプレートで実際に展開される HTML は次のようになります。 なお、 http://hxxk.jp/mt/system/template/customize/ 上で展開したと仮定します。 カテゴリアーカイブ撤廃に伴い、現在はこのディレクトリは存在しません。

<p>
<a href="http://hxxk.jp/mt/">MT hxxks</a>
&#62; system
&#62; template
&#62; customize
</p>

system カテゴリも template カテゴリも、その直下には記事を持っていないため、アーカイブが生成されません。 よって、このように対処して、アーカイブが存在しないカテゴリへのリンクは張らない方が良いということになります。

リプライ

4 件のリプライが送られています。

2005-04-22T21:03+09:00 - しん

真琴さん、こんばんわ。 「私の考えるソース ver.2」、コピペでバッチリできました。 どうもありがとうございました。 (MovableType、相変わらず再構築に涙ですが)今回お世話になったのは、約2ヶ月悩み諦めてしまったタグゆえ、再構築とは別の感激の意味で涙ものです。 あと1点、細かい所ですが、「私の考えるソース ver.2」では、親カテゴリのページを表示させたときだけ、「&#62;」が2つ連続で出てきます。「ブログ>>親カテゴリ」。現状では[ブログ]>親カテゴリという風に設定して、あまり目立たないようにしていますが(>>とて元々目立つものではありませんが)、これは 「glue="&#62;"」の限界でしょうか。

2005-04-24T00:03+09:00 - 真琴

exclude_current="1" を指定していると、カテゴリに区切りが発生しない状態 ( 親カテゴリ ) でも区切り文字が発生するようです。 詳しくは <a href="http://hxxk.jp/mt/2005/04/23/2356">http://hxxk.jp/mt/2005/04/23/2356</a> にて。

2005-09-13T14:57+09:00 - パンくずリストの設置 < ブログ別!作成・カスタマイズ講座

今回は、パンくずリストの設置方法について説明します。掲示板にてリクエストがありましたので、早速、取り上げてみました^^ パンくずリスト(パン屑リスト、トピックパ...

2006-01-03T23:00+09:00 - しずか

こんばんは。 感謝です。 私もPHPって、何がなんだかわからないので、ほかのところのパンくずのコードって、あまり使いたくありませんでした。 こういうソースを公開していただいて、ありがとう。 また、よらせてもらいます。

この記事に対するご意見やご質問、ご感想などありましたらこのフォームに簡潔に記入して下さい。 簡潔に記入できない場合や、関連記事にてご意見をお寄せいただく場合は、ご自身の weblog にて記事を書かれた上で あてにトラックバックとして送信してください。

記入フォーム

補足情報

著作、講演、制作実績など