本文へジャンプ

Movable Type 再構築高速化
<mt:SearchEntryField>
(by PowerCMS)

再構築を軽くするための小ネタ。 今回のケースは、記事の出力を複数の条件で絞り込む場合です。

条件の組み合わせによっては、<mt:Entries>だけで済むのですが、
複数のカスタムフィールドで絞り込むなどの場合は、どうしても<mt:If>を使用しなくてはいけません。
その場合、出力件数を大きくしなくてはいけなくなり、再構築の時間が増えてしまいます。

関連記事を表示してみる

記事の詳細ページに、関連記事を表示するという例で2パターンつくってみて
再構築にかかった時間を比較してみたいと思います。

  • 「記事」を対象。
  • 「自分の記事ID」を指定した別ブログの記事を出力。
  • カスタムフィールド「select_entry」で、記事IDを指定。カンマ区切りで複数指定あり。
  • 条件に合う記事最新2件を表示したい。

mt:If で絞り込む場合

全記事を対象に、条件に合うものだけ表示するようにしています。
対象記事数が増えると再構築の時間がどんどん増えていきます。

今回は使えませんが、カスタムフィールドの値が一つ(完全一致)であれば「field:~」を使えます。
orやandのような複雑な絞り込みはできません。

<$mt:SetVar name="display_count" value="0"$>
<$mt:EntryID setvar="SET_entID"$>
<mt:Entries lastn="0" include_blogs="xxx">
<mt:If name="display_count" ge="2">
<mt:If tag="select_entry" like="$SET_entID">
(出力内容)
<$mt:SetVar name="display_count" op="++"$>
</mt:If>
</mt:If>
</mt:Entries>

mt:SearchEntryField タグを使う場合

<mt:SearchEntryField>タグは、PowerCMSで使えるタグです。
先ほどできなかったカスタムフィールドの複数の値に対応できます。
ちなみに、operator モディファイアには like, notlike , notnull , not, >, >=, <, <=, != などいろいろ指定できます。

<$mt:EntryID setvar="SET_entID"$>
<mt:SearchEntryField field="select_entry" query="$SET_entID" operator="like" lastn="2" include_blogs="xxx">
(出力内容)
</mt:SearchEntryField>

先ほどのmt:Ifの例と比べるとソースがだいぶスッキリしましたね。

再構築を計測

記事が1000件ほどあった場合の再構築にかかった時間を計測してみました。
サーバーのスペック、カスタムフィールドの数などいろいろな条件により時間は変わるのでご参考程度に。

<mt:If> の場合

  • 4.93798518180847
  • 4.93015789985657
  • 7.86999797821045

→ 約5.9126秒

<mt:SearchEntryField> の場合

  • 0.0021510124206543
  • 0.00218820571899414
  • 0.00203108787536621

→ 約0.002123秒

まとめ

全記事をなめない分、<mt:SearchEntryField>~</mt:SearchEntryField>で絞り込んだほうが圧倒的い早いですね。
記事が増えてくるとどうしても再構築が重くなってくるので
積極的にPowerCMS特有の機能を使っていきましょう。

Recent Entries
MD EVENT REPORT
What's Hot?