2005-02-04 アーカイブ

http://hxxk.jp/2005/02/04/

カテゴリアーカイブとナビゲーションリスト

記事データ

投稿者

望月真琴

投稿日時

2005-02-04T02:32+09:00

タグ
概要

カテゴリアーカイブは、性質上カテゴリの絞込みが自動で行われるため、カテゴリリストや新着記事のリストを作る際に落とし穴にはまりやすいのです。

リプライ

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

記事本文

カテゴリアーカイブの特徴

Movable Type 3.11 のサブカテゴリ機能についての所感 (3) - デフォルトのカテゴリアーカイブでも同じようなことを述べましたが、改めて述べます。

カテゴリアーカイブは、大雑把に言うと category=``category name'' を指定した状態と同じようなアーカイブです。 例えば、 MT hxxks - customize titles という、 customize カテゴリの記事タイトル一覧のアーカイブがありましたが、その中の <MTEntries><MTEntries category="customize"> と指定したのと同じ状態になります。

よって、カテゴリアーカイブ内のナビゲーション部分で記事リストを作ろうとすると、既に category name で抽出された中から作られます。 例えば、 customize カテゴリにおける <MTEntries lastn="N"> という指定は、 <MTEntries category="customize" lastn="N"> と指定されたことと同じになってしまい、 customize カテゴリの中の最新 N 件の記事リストが作成されます。

同様に、カテゴリアーカイブ内のナビゲーション部分でカテゴリリストを作ろうとすると、これも既に category name で抽出された中から作られます。 例えば、 customize カテゴリにおける <MTCategories> という指定でカテゴリ一覧を作ろうと思っても、 customize カテゴリ以下に存在するカテゴリのリストしか作れません。

カテゴリアーカイブ内でも全カテゴリのリストを作る

カテゴリアーカイブ内でも、その他のページと同様にカテゴリリストを作成したい場合は、 MTSubCategories を MTTopLevelCategories に置き換えれば良いです。 テンプレート・ タグ - MTTopLevelCategories にて解説されていますが、

MTSubCategoriesのクローン。 ただし、カテゴリー階層の最上位で常に開始します。

というように、現在のカテゴリ階層に関係なく最上位、すなわち weblog 全体のカテゴリからカテゴリリストを作成します。

カテゴリアーカイブ内でも全記事の新着記事リストを作る (1)

カテゴリアーカイブ内で、カテゴリの中での最新 N 件での表示ではなくて、全体の最新 N 件の記事リストを作りたい場合はいくつかの方法があります。 一つは、 MTInclude を用いる方法です。

MTInclude には module 属性と file 属性のどちらかを指定するようになっています。

module

主にテンプレートの記述を簡略化する目的で用います。

例えば、ヘッダなど、すべてのHTMLファイルに共通する部分があって、その部分をMovable Typeを使って管理したいとき、共通部分をテンプレート・モジュールにして、その名前をHeaderに設定した後で、<MTInclude>を使って、次のように読みこみます。

<$MTInclude module="Header"$>

あくまでモジュールであるため、本来のテンプレートの性質を継承します。

file

外部ファイルを読み込むことで、本来のテンプレートの性質に関係なく、記事リスト等を作成できます。

今回のような目的で MTInclude を使う場合は、 module 属性ではなく file 属性を指定します。 module 属性を使った場合、モジュールを呼び出した時点ではテンプレートタグを読み込んでいるだけなので、実際のアーカイブ生成の際はカテゴリアーカイブの性質を継承してしまうためです。

  1. 「メインページ」テンプレートから、新しい記事を表示する部分をコピーします。

    <ul>
    <MTEntries lastn="10">
    <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
    </MTEntries>
    </ul>
  2. 「新しいインデックス・テンプレートを作る」から、新規テンプレート「 recent_entries 」を作成し、テンプレートの中身に先程のコードを貼り付けます。 ここでは、ファイル名を「 recent_entries.html 」と設定します。 なお、「インデックス・テンプレートを再構築するときにこのテンプレートを自動的に再構築する」のチェックを外さないようにしてください。

  3. カテゴリアーカイブのテンプレートの、任意の場所に <$MTInclude file="recent_entries.html"$> と記述して、再構築を行うと完成です。

カテゴリアーカイブ内でも全記事の新着記事リストを作る (2)

MTInclude 以外に、 PHPSSI を使って include する方法もあります。 前項の手順で、アーカイブテンプレートの <$MTInclude file="recent_entries.html"$>PHP または SSI の記述に置き換えるだけです。

この方法と MTInclude は、似ているようで大きな違いがあります。

このファイルはページがリビルトされるそのときに読み込まれます。 SSI (Server Side Includes)と混同しないように注意してください。 SSIはウェブサーバにリクエストが来るたびに、毎回外部ファイルを読み込みます。 <MTInclude>を使う場合は、まず外部ファイルを編集した後、編集されたページを読み込むためにリビルドしてください。

新たな記事を書いた場合、 recent_entries.html 自体は自動でリビルドされます。 しかし、 MTInclude で recent_entries.html を読み込んでいる場合、その読み込んでいる元のアーカイブをリビルドしない限り、前回のリビルド時点の recent_entries.html が読み込まれたままになります。 例えば、月別アーカイブとカテゴリアーカイブの両方で recent_entries.html を読み込んでいた場合に、一方だけをリビルドし、もう一方をリビルドしないでおくとその違いが分かると思います。

対して PHPSSI で include している場合は、 UA からのリクエストがあって初めて recent_entries.html を読み込むため、読み込んでいる元のアーカイブをリビルドしようとしまいと、最新の recent_entries.html を反映します。

また、 MTInclude の場合は recent_entries.html を読み込んだ状態でサーバにファイルを put しますが、 PHPSSI の場合は、あくまで読み込みの命令が書かれた状態でサーバに put されるため、サーバの容量をあまり圧迫せずに済む、という利点もあります。 例えば、 recent_entries.html が 10KB のサイズで、カテゴリアーカイブが 10 個あり、それぞれの本体が 50KB のサイズだとすると、 MTInclude の場合は合計で ( 50 + 10 ) * 10 = 600KB のサイズとなるのに対し、 PHPSSI の場合は合計で 50 * 10 + 10 = 510 KB のサイズとなります。

まとめ

  • カテゴリアーカイブ内でカテゴリリストを作る場合は MTTopLevelCategories を使う。
  • カテゴリアーカイブ内で全体の新着記事リストを作る場合は PHPSSI が使える環境であればそれで include する。 使えない環境の場合のみ MTInclude を用いる。

リプライ

20 件のリプライが送られています。 この記事に対するご意見やご質問、ご感想などありましたら個別記事ページの送信フォームからお送り下さい。

2005-03-08T07:35+09:00 - やりました!メインページ以外の2カラム化 < ななたまご

時間にして2時間弱。こんなにかかってしまいました・・・(;´Д`)ウウッ… 最...

2005-05-20T05:53+09:00 - MTInclude とダイナミックパブリッシング < MovableType Tips by Sonots

テンプレートをモジュール化し、MTInclude テンプレートタグでとりこむことで、 テンプレートの編集が楽になります。 ダイナミックパブリッシング時には、MT...

2005-07-29T18:30+09:00 - アーカイブのカテゴリーリスト表示 < Jubilee

各アーカイブページのテンプレを整えました。 …が、そこで「カテゴリアーカイブではカテゴリリストが正常...

2005-10-05T12:57+09:00 - にいじま

「カテゴリアーカイブ内でも全記事の新着記事リストを作る(1)」を参照させていただきました。感謝です!

2005-10-12T00:46+09:00 - 真琴

どうもです :) これ、シンプルなことだけど意外とはまりやすいんですよねえ……。

2005-12-24T22:17+09:00 - MT:全カテゴリで共通のナビゲーションを表示 < kawama.jp

<MTSubCategories>の変わりに<MTTopLev...

2006-04-15T04:40+09:00 - アーカイブページの性質とサイト全体で共通のナビゲーション < Blog.37to.net

エントリーアーカイブでコメントとトラックバックを付けたついでに、 トップページ...

2006-04-15T11:47+09:00 - 真琴

トラックバックをいただいた <a href="http://blog.37to.net/2006/04/post_24.html">http://blog.37to.net/2006/04/post_24.html</a> に書いてありますけど、 &#60;MTArchiveList&#62; テンプレートタグで実現できますね。いずれ作る新コンテンツではちゃんと扱おう……

2006-04-17T06:23+09:00 - アーカイブページの性質とサイト全体で共通のナビゲーション < Blog.37to.net

エントリーアーカイブでコメントとトラックバックを付けたついでに、 トップページ...

2006-04-17T06:29+09:00 - 37to

初めまして、先日トラックバック送信させて頂いた、37toと申します。 エントリを修正した際に再びトラックバックが送信されてしまい、 2重トラックバックになってしまいました。 申し訳ございません。 お手数ですが、削除願います。

2006-04-18T23:54+09:00 - 真琴

対処しました。 Trackback Auto-Discovery が有効になっていたのでしょうか ?

2006-04-20T14:33+09:00 - 37to

2重トラックバックの件、お手数掛けまして申し訳ございません。 Trackback Auto-Discoveryという設定を初めて聞いたので、真琴さんの記事を読ませて頂きました。 自分のブログを確認したところ、Trackback Auto-Discoveryは無効になってます。 エントリー投稿時にトラックバックPINGを指定してトラックバックを送信してたのですが、 エントリー内容を修正して保存する時に、トラックバックPINGの送信先が残ってると、 再度トラックバックが送信されてしまう事を知りませんでした。 今後エントリーを修正する際は、 以前に送ったトラックバックPINGを消してから再保存することで、対処していきます。 ご迷惑かけて申し訳ございません。 追伸: 真琴さんのブログは参考になる記事が多く、とても為になります^^ 今後もちょくちょく寄らせて頂くと思いますので、宜しくお願いしますm(_ _)m

2006-04-23T02:03+09:00 - 真琴

あらら、普通はトラックバックの送信に成功した時点でトラックバック送信先の欄から Ping URI はクリアされるはずなんですけどね。 何らかの原因で残ったままになっていたのかもしれませんね。

2006-07-12T23:13+09:00 - ひろろ

カテゴリアーカイブ内でも全記事の新着記事リストを作る (1)を参考に、カテゴリアーカイブ内で、ほかカテゴリの記事リストを表示することができました。イロイロ調べてもみつからなくて、無理だクライアントに謝ってゆるしてもらおうと思っていたところで、このサイトに出会いました。ありがとうございます!ほんと涙がでそうなくらい嬉しい。

2006-07-15T12:31+09:00 - 真琴

(1) の方だと、記事を追加するたびにカテゴリアーカイブをリビルドしないといけないのがちょっとネックです。その点だけお気をつけください :-)

2006-07-18T20:05+09:00 - ひろろ

真琴さんのいったとおり、クライアントからツッコミがはいりました(T_T) そこでのように修正してみたのですが動作しません。ファイルをフルパスで指定してもだめで。にするとヤフー表示されるのですが。。 phpの知識が乏しいので、何はひっかかっていることがあるのか。現在またしてもはまってます。movable type甘くみてたっす。

2006-07-18T20:09+09:00 - ひろろ

タグが消えてしまってました。<?php include('recent_entries.html'); ?> ヤフーは<?php include('http://www.yahoo.co.jp'); ?>

2006-07-18T23:49+09:00 - 真琴

フルパスって言っても 2 種類ありますからねえ。 (http://hxxk.jp/2005/11/01/2209) MTBlogSitePath (http://www.sixapart.jp/movabletype/manual/3.3/a_template_tag_reference/#MTBlogSitePath) を使って、&#60;&#36;MTBlogSitePath&#36;&#62;recent_entries.html のような指定をしてはいかがでしょう ?

2006-07-19T11:34+09:00 - ひろろ

<$MTBlogSitePath$>を使うとうまく動作しました。「ウェブ・ブラウザーで表示するURLとファイルが実際に保管されるパス」があるのですね。勉強になります。 真琴さん、ありがとうございます。

2007-03-25T23:41+09:00 - MT:カテゴリーアーカイブなどでの最新記事の表示 < kubolog - クボログ -

カテゴリーアーカイブを見たときに、 サイドバーの最新の記事の部分が、 そのカテゴ...

補足情報

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