拙著「WordPress Web開発逆引きレシピ」が発売されました。
WordPressの様々なカスタマイズについて、逆引きの形式で取り上げています。
PHP 7.0での動作確認も行っています。
カテゴリを記事が投稿された順に表示する(その2)
昨日の記事の続きで、カテゴリの一覧を、記事が投稿された順に表示する方法を解説します。
1.考え方
昨日、ハッシュの使い方を解説しました。
その中で、MTLoopタグを使って、ハッシュの各要素をキーや値で並べ替えて出力する方法を紹介しました。
カテゴリを、記事が投稿された順に出力する場合も、このテクニックを利用します。
以下のようなハッシュを考えてみてください。
- キー = 各カテゴリの最新記事の日付
- 値 = 各カテゴリの最新記事へのリンク
このハッシュを、キーの逆順で並べ替えます。
キーは各カテゴリの最新記事の日付ですので、その逆順で並べ替えると、新しく記事が投稿されたカテゴリから順に出力されることになります。
これで、ハッシュの各要素の値を順に出力すれば、記事の投稿順にカテゴリを出力できます。
2.ハッシュを作る
上の考え方に沿って、まずはハッシュを作る処理を書きます。
ここでは、カテゴリのリストを以下のように出力するものとします。
<ul> <li><a href="カテゴリAのアーカイブへのリンク">カテゴリAの名前</a> <ul> <li><a href="カテゴリAの最新記事へのリンク">カテゴリAの最新記事のタイトル</a></li> </ul> </li> <li><a href="カテゴリBのアーカイブへのリンク">カテゴリBの名前</a> <ul> <li><a href="カテゴリBの最新記事へのリンク">カテゴリBの最新記事のタイトル</a></li> </ul> </li> ・・・ </ul>
ハッシュを作るためのテンプレートタグの組み方は、以下のようになります。
<mt:Categories> <mt:Entries lastn="1" sort_order="descend"> <mt:SetVarBlock name="entry_date"><mt:EntryDate format="%Y%m%d%H%M%S"><mt:CategoryId sprintf="%06d"></mt:SetVarBlock> <mt:SetVarBlock name="catlist" key="$entry_date"> <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a> <ul> <li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a>(<$mt:EntryDate$>)</li> </ul> </li> </mt:SetVarBlock> </mt:Entries> </mt:Categories>
各行の内容は以下の通りです。
行 | 内容 |
---|---|
1/12 | カテゴリを順に出力します。 |
2/11 | 各カテゴリの最新の記事を1件出力します。 |
3 | 最新記事の日付と、カテゴリのIDを組み合わせた値を、「entry_date」という変数に代入します。 この値を、ハッシュのキーとして使います。 |
4~10 | 変数entry_dateの値がキー、カテゴリの最新記事へのリンクが値となるように、「catlist」という名前のハッシュに要素を追加します。 |
3.ハッシュを出力する
ここまででハッシュができました。
次に、ハッシュを日付の逆順で並べ替えて出力します。
そのタグの組み方は、以下のようになります。
<mt:Loop name="catlist" sort_by="key reverse"> <mt:If name="__first__"><ul></mt:If> <mt:GetVar name="__value__" setvar="tmp"> <mt:If name="__counter__" le="3"> <$mt:GetVar name="tmp"$> </mt:If> <mt:If name="__last__"></ul></mt:If> </mt:Loop>
各行の内容は以下の通りです。
行 | 内容 |
---|---|
1/8 | ハッシュの各要素を、キー(各カテゴリの最新記事の日付)の逆順で順に出力します。 |
2 | ハッシュの先頭の要素のときに、リスト全体を囲む<ul>タグを出力します。 |
3 | ハッシュの値(変数__value__)を、「tmp」という変数に保管しておきます(このあとのMTIfタグのブロック内では、変数__value__の値が書き変わってしまうため)。 |
4~6 | 変数__counter__の値が3以下の場合のみ、変数tmpの値(=ハッシュのキーの値)を出力します。 変数__counter__は繰り返しが行われた回数を表す変数です。 |
7 | ハッシュの最後の要素のときに、リスト全体を囲む</ul>タグを出力します。 |
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください
taco
mixiで質問させてもらったモノです。
すごく丁寧に説明してもらって、
初心者の私でもすごく分かりやすかったです。
MTの機能だけではできないと思っていたので本当に助かりました。
tinybeans
はじめまして。昨日の記事にトラバさせていただいた者です。いつも壱さんのブログと書籍で勉強させていただいております。
今回の記事のMTLoopの記述方法がすごく勉強になりました。
特に「3.ハッシュを出力する」の3行目の MTGetVar タグのところです。この1行がなくて、5行目のところ(MTIf内)で直接ハッシュの値を出力しようとすると「1、2、3」という出力結果になってしまうんですよね。僕はその部分がこれまでずっとわからなかったところでした。
とても勉強になりました!ありがとうございます。
壱
>tacoさん
こんにちは。
テンプレートで変数を使うと、この例のように、(複雑とは言え)テンプレートだけで処理できることが多いです。
ぜひ変数を活用してください。
壱からtinybeansへの返信
>tinybeansさん
こんにちは。
出力が「1、2、3」になるのは、MTの不具合のような気もします。
私も最初この問題にあたって、「何で?」としばらく悩んでしまいました。
林
記事と直接関係のないコメントですみません。
以前から、指定した日付、または特定のエントリーの日付に
近い日付のエントリーを取り出すプラグインを探していました。
見つからずに半分諦めていた。
このエントリーを見て、
絶対値(「指定した日付」-「エントリーの日付」)
順に並べなおせば可能になるのではないか、と思ったのですが、
実際のところ、可能なのでしょうか?
壱
>林さん
こんにちは。
お書きになったような方法でテンプレートを組むこと自体は、可能だと思います。
ただ、再構築のパフォーマンスに影響しそうな感じがします。
林
> 壱さん
そうですか。
これ以上、再構築が遅くなるのはできれば避けたいので、
より早く実現できる方法が思い当たれば教えていただけないでしょうか。
他に方法がなさそうであれば、上記の方法で試行錯誤してみたいと思います。
林
> 壱さん
そうですか。
これ以上、再構築が遅くなるのはできれば避けたいので、
より早く実現できる方法が思い当たれば教えていただけないでしょうか。
他に方法がなさそうであれば、上記の方法で試行錯誤してみたいと思います。
壱から林への返信
>林さん
こんにちは。
テンプレートで変数を使うとかなりいろいろなことができますが、処理速度的には最適とは言えません。
処理を速くするには、プラグインを作るしかないと思います。
林から林への返信
> 壱さん
ありがとうございます。
・・・結局、プラグインを自分で作るしかないのですね。
作れるだけの力があればいいのですが、私には難しそうですので、当面の所、あきらめます。