以前エントリーを更新順にソートするという記事を書きましたが、実はMT4からは新しくlimit モディファイアが追加され、複雑なことをしなくても簡単にエントリーを更新順に並び変えることができるようになっていました。詳しくは以下。
lastn モディファイアと limit モディファイアの違い
公式サイトで詳しく説明されているのでここであらためて言及することもないのですが、要するにプラグイン使わなくても標準のMTタグだけでこちらの基本と同じことが出来てしまうということです。こんなに単純に処理できるようになっていたとは、ありがたい。以下、その方法。
■更新のあったエントリーを最新10件分表示する(MT4以降)
<ul>
<MTEntries limit="10" sort_by="modified_on">
<li><$MTEntryModifiedDate format="%y/%m/%d"$> <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ul>
以上これで終り…では芸がないので、「MT4版応用編:更新一覧に表示させたいエントリーのみ最新10件分表示する」も付けておきます。
<追記>
以下のサンプルは変数の理解の浅い時期に書いたものなので、あまりいい例になっていません。4.2になってカスタムフィールドの値で直接ソートが出来るようになったことを受けて、以下のサンプルの修正版も含めて、記事のまとめ直しをしていますので、そちらをご覧下さい。
>> エントリーを更新順にソートする~更新リストの作り方(3) MT4改
■おまけ~更新一覧に表示させたいエントリーのみ最新10件分表示する(MT4.1以降専用)
単純にmodified_onでソートするだけなら上ので十分なんですが、やっぱり誤字・脱字などの内容のない修正は更新リストに反映させたくないじゃないですか。前回は「エントリータグで目印をつけて内容に更新のあった場合のみ表示する」ことを考えたのですが、トラバいただいた先のご指摘の通り、「更新リストにまだ残っている状態で誤字・脱字の修正を行うとリストの一番上に上がってしまう・かといって@更新を外せば更新リストからも消えてしまう」という問題があったのですね。
ここで概要を利用する方法が提案されてますが、概要に数字を入れると、トラックバックした先に数字が表示されてしまうという問題が。トラバは行わないブログなら使えるけど、<$MTEntryExcerpt$>を使っているところを全部書き換える必要が生じたりなど、他に影響が出る可能性もあります。できれば既存のフィールドはそのまま本来の目的で使えるようにしておきたい。ということで、4.1から加わったカスタムフィールドを使ってソートする方法を考えてみました。
1.カスタムフィールドを作る
2種類作ります。いずれもブログ記事で。
A)更新チェック用のチェックボックス
名前:更新チェック
説明:更新リストに載せたい場合はチェックを入れて下さい。
種類:チェックボックス
規定値:(サンプルはチェック入れてませんが、お好みで)
ベースネーム:entryupcheck
テンプレートタグ:entryupcheck
B)任意の更新日を記入するためのフィールド
名前:更新日
説明:記入方式 例:2008年1月15日→08/01/15
必須?:チェックなし
種類:テキスト
規定値:なし
ベースネーム:entryupdate
テンプレートタグ:entryupdate
2.使い方
上の方法でフィールドを作ると、記事投稿画面に以下のフィールドが出てきます。
- 更新リストに載せたい場合はチェックを入れ、更新日フィールドに最新の日付を入れます。記入方式は好きな様式でいいですが、この日付がソートの対象になり、かつ更新リストの更新日としても使われることを考えて決めます。また全記事同じ書き方になるようにします。
- 更新リストから除外したい場合・載せたくない場合はチェックを外します。
- 更新リストにまだ残っている記事で、リストには残しておきたいが誤字・脱字修正で上げたくない場合は、チェックは外さず、更新日は前に記入したままの日付にしておきます。
3.リストのコード
以下のコードを好きな箇所に(ulのclassなどは使用テンプレに合わせて追加)。 赤字の部分に表示したい数より1つ多い数を指定しておきます(例:10個並べたい場合は11にする)。
<MTSetvar name="upcount" value="0">
<MTEntries lastn="0" sort_by="modified_on">
<MTIfNonZero tag="entryupcheck">
<MTSetVar name="upcount" op="++">
<MTIf name="upcount" lt="11">
<MTSetVarBlock name="update"><$MTentryupdate$></MTSetVarBlock>
<MTSetVarBlock name="upentry"><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></MTSetVarBlock>
<MTSethashVar name="uplist">
<MTSetVar name="$update" value="$upentry">
</MTSethashVar>
</MTIf>
</MTIfNonZero>
</MTEntries>
<ul>
<MTLoop name="uplist" sort_by="key reverse">
<li><MTVar name="__key__"> <$MTVar name="__value__"$></li>
</MTLoop>
</ul>
【補足説明】
<MTEntries lastn="0" sort_by="modified_on">~</MTEntries>で全記事を更新順に並び変えています。
<MTIfNonZero tag="entryupcheck">~</MTIfNonZero>で更新チェックが入っている記事のみを抽出しています。
<MTIf name="upcount" lt="11">~</MTIf>で表示したい記事数のみにしています。
青字の部分で以上の作業で抽出された記事をハッシュ変数に設定してます。
<MTLoop>で記事を任意の更新日順で並び変えています。
*更新日付を載せなくてもいい場合は<MTVar name="__key__">を削除すればいいです。
もっとスマートな方法がある気がしますが、このエントリーの本来の目的は「MT4からはlimit モディファイアが更新リストに使えるよ~」ということを覚え書きすることなので、まあいいかと(その割にはおまけの部分が多いですが^^;)。
実はlimit モディファイアの効用については大分前に気づいていたのだけど、おまけコーナーのコード組みに頭をひねっていたためエントリーが遅れたというオチ。
コメント
成海 | 2008年8月29日 11:08
更新順のソートですが、コメントを投稿したときは、「sort_by="modified_on"」の更新にはあてはまらないのでしょうか。
エントリー自体の更新しているわけではないから、なのか、「更新していない」挙動になりました。
「エントリーを更新順に並べる」を維持しつつ、コメントが追加された際にも、そのエントリーを更新したものとして扱い、順を「sort_by="modified_on"」にしたい場合は、どんな方法がありますか。
TAEKO | 2008年8月30日 20:43
こんにちは。
modified_onは「投稿画面から保存ボタンを押した時の日時」なので、コメントの投稿は反映されないと思います。
コメントの投稿順でエントリーをソートする時は、recently_commented_onを使って「最近のコメント」として表示するケースが多いと思いますが、それを一緒にしてしまいたいということでしょうか?
その場合、更新日時と最新のコメント投稿日時を比較して、新しい方をソートのキーに指定すれば<MTLoop>と<MTFor>を使って出来ると思います。やり方は↓こちらのサンプル2の応用でいけるかと思います。
http://wing.w-museum.com/200808222254.html
成海 | 2008年8月31日 12:02
いつもありがとうございます。
コメントへのご理解ありがとうございます。
エントリーのソートのかかり方を、
「通常のmodified_on順」+「最新のコメント順」を組み合わせた形にしたいです。
要は「modified_on」がコメントしたときも効いてくれれば話が早いのですが。。。
まずはご提示いただいたエントリーを熟読させてもらってトライしてみます。
思ってたよりも難しい処理が必要でちょっとびびっていますw
また詰まったら質問させてください。
TAEKO | 2008年8月31日 15:17
内容の更新にコメントが混ざると困るという場合もあると思うので、modified_onの動きは今ので妥当かな~と思ってます(^^;。
変数を駆使すればご要望のことは出来ると思うので、いろいろ試してみて下さい。