Movable Type Open Source 4.15β5bと、Movable Type 4.15β2が公開されました。
Movable Type 4.15β2にはカスタムフィールド機能がありますが、カスタムフィールドの値によって、ブログ記事を並べ替えたりフィルタリングしたりする機能が追加されました。
1.並べ替えとフィルタリングの概要
カスタムフィールドによる並べ替えやフィルタリングは、変数と条件判断を組み合わせれば、これまでのバージョンでもできないことはありませんでした。
しかし、それだとテンプレートが複雑になります。
並べ替えとフィルタリングが標準機能として搭載されたことで、より使いやすくなりました。
具体的なテンプレートタグの書き方は、MOVABLETYPE.JPに記事が公開されていますので、そちらを参照してください。
また、小粋空間さんでも解説記事が公開されています。
2.並べ替えのパフォーマンスは大丈夫?
コードの動作を追った限りでは、並べ替えはパフォーマンスの点で、やや問題がありそうだと思われます。
現状のコードでは、ブログ内のすべての公開済みブログ記事をデータベースから読み込んだ後、Perlのsort演算子で並べ替える、という仕組みが取られています。
この仕組みだと、SQLでの並べ替えに比べて、速度やメモリ消費量の点で不利そうです。
MTでは、データベースに対する処理を行う際に、個々の処理からSQLを直接に発行せずに、MT内部でO/Rマッピングを行う仕組みがとられています。
一般的なデータの読み込みなら、このO/Rマッピングで問題なく対応できます。
しかし、やや変わった方法でデータを読み込もうとすると、「MTのO/Rマッピングの壁」にぶつかることがままあります。
「カスタムフィールドの値による並べ替え」も、この壁にぶつかっていて、前述したような処理手順が取られているものと思われます。
なお、フィルタリングはSQLで行われていました。


コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。
>現状のコードでは、ブログ内のすべての公開済みブログ記事をデータベースから読み込んだ後、Perlのsort演算子で並べ替える、という仕組みが取られています。
そうでしたっけ。あまりウォッチしていないのですけれど、
(1) $ctx->stash('entries')が定義されている場合(つまりアーカイブテンプレートなど)は、sort演算子でソートされる。
(2) そうでなければ、エントリーリストを読み込む際に一緒にソートできるのでSQLを使ってソートされる。
となっていたように思います。
また前者の場合は、sort_byで指定されている項目がカスタムフィールドのフィールドでなくてもsort演算子でソートされるので、カスタムフィールドでソートする場合に限って格別に遅いということもないと思います。もちろん、MT::Metaデータをアクセスするオーバーヘッドはありますが。
ああ、違いました。確かにどちらもsort演算子でソートされそうですね。
>(o)さん
こんにちは。
$ctx->stash('entries')が定義されている場合は、おっしゃるとおりsort演算子で処理されます。
一方、$ctx->stash('entries')が定義されていない場合でも、抽出条件が複雑になると、SQLではなくsort演算子が使われる場合があります。
カスタムフィールドによる並べ替えも、sort演算子で処理されていました(処理の途中に、動作状況をログに出力するコードを入れて、動作を確認しました)。