PowerCMS X ブログ

2023-12-06

SplitPageプラグインで記事の最新 n件を対象にページ分割したい

SplitPageプラグインは記事などの一覧ページを指定件数で分割するオプションプラグインです。

このプラグインを使うと件数の多いページを指定件数で分割するだけでなく、ページネーションを表示させることもできて便利ですが、件数が多くなると再構築の負荷が高くなります。日付アーカイブ(月別)などと比較して効率が悪いことに留意してください。

ページネーションの例

  • 月別アーカイブが更新されるのは、その記事が属している(日付が変更された時はその記事が属していた)月の一覧のみ
  • SplitPageプラグインによって分割されたページは、どの記事が更新・追加・削除されても全てのページが更新(再構築)される

そこで、件数が多い場合、最新の一定の件数分を取得して、それを対象に分割したいケースに対応する方法について紹介します。例として、公開日順に最新100件を対象にページ分割するビューの書き方を考えてみます。

mt:emtries limit="100"指定は SplitPageでは効かない

思いつくのはループタグに limit(lastn)を指定することですが、SplitPageプラグインは条件に合致するものすべてを対象に分割するため、この指定は効きません。

offset, limit指定で101件目の日付を取得してconditions属性を利用する

そこで、conditions属性を指定して101件目の公開日を取得し、その日付以降のものをフィルタリングします。

conditions属性には「カラム名=フィルタ条件,フィルタの値」という形式でハッシュ変数を生成して渡します。

指定可能なフィルタ

フィルタ 説明
ct (like) Contains (含む)
nc Not Contains (含まない)
gt Greater Than (より大きい)
lt Less Than (より小さい)
ge Greater than or Equal (以上)
le Less than or Equal (以下)
eq Equal (等しい)
ne Not Equal (等しくない)
bw Begin with (から始まる)
ew End with (で終わる)
<mt:setvar name="last_update" value="2020-01-01 00:00:00" note="件数に満たなかった時の初期値">
<mt:entries cols="published_on" sort_by="published_on" sort_order="descend" offset="100" limit="1" ignore_filter="1">
    <mt:ignore>日付順で101番目に新しい記事の公開日を取得</mt:ignore>
    <mt:entrydate setvar="last_update">
</mt:entries>
<mt:ignore>gt=より新しい</mt:ignore>
<mt:sethashvars name="conditions">
    published_on=gt,<mt:var name="last_update">
</mt:sethashvars>
<mt:entries conditions="$conditions" _split="1" sort_by="published_on" sort_order="descend">
    ...
</mt:entries>

この方法では、101件目の記事と全く同じ公開日時の記事があった時に件数が合わない(件数が不足する)可能性があります(published_onではなくidを利用すればそのようなことはなくなります)。確実に100件を取得するには「gt」の代わりに「ge(以上)」を指定すると良いでしょう(逆に多くマッチする可能性があります。)。

<mt:setvar name="last_update" value="2020-01-01 00:00:00" note="件数に満たなかった時の初期値">
<mt:entries cols="published_on" sort_by="published_on" sort_order="descend" offset="99" limit="1" ignore_filter="1">
    <mt:ignore>日付順で100番目に新しい記事の公開日を取得</mt:ignore>
    <mt:entrydate setvar="last_update">
</mt:entries>
<mt:ignore>ge=同じか、より新しい</mt:ignore>
<mt:sethashvars name="conditions">
    published_on=ge,<mt:var name="last_update">
</mt:sethashvars>
<mt:entries conditions="$conditions" _split="1" sort_by="published_on" sort_order="descend">
    ...
</mt:entries>

(2024年9月2日修正) サンプルコードに「ignore_filter="1"」を追記しました。

カテゴリー:テンプレート作成Tips | プラグイン | 技術情報

投稿者:Junnama Noda

ブログ内検索

アーカイブ