同一カテゴリブログ記事一覧の出力(その2・MT標準機能活用編)

昨日に続いて、個々のブログ記事のサイドバーに、その記事が属するカテゴリの記事一覧を出力する方法を紹介します。
今日は、Movable Type標準の「テンプレートモジュールのキャッシュ」と「PHPによるインクルード」の機能を使う方法を解説します。

1.テンプレートモジュールのキャッシュとPHPによるインクルード

まず、「テンプレートモジュールのキャッシュ」と、「PHPによるインクルード」について概要を述べます。

1-1.テンプレートモジュールのキャッシュ

Movable Type 4.2以降では、「テンプレートモジュールのキャッシュ」という機能が追加されました。
テンプレートモジュールのキャッシュは、一度再構築したテンプレートモジュールをキャッシュとして保存しておき、同じテンプレートモジュールを再構築する際には、キャッシュを利用する仕組みです。
テンプレートモジュールを一度再構築するだけで済み、無駄な再構築が削減されて時間短縮に効果があります。

1-2.PHPによるインクルード

テンプレートモジュールをキャッシュするとともに、そのテンプレートモジュールの再構築結果を、サーバー側でインクルードするようにすることもできます。
昨日解説した手法を、Movable Typeの標準機能で行うようなイメージになります。
また、インクルードの際に使う言語として、PHP/ASP/JSP/SSIを選ぶことができます。

1-3.両機能を使うための設定

テンプレートモジュールのキャッシュとPHPによるインクルードの機能を使うには、以下の手順を取ります。

  • ブログ(またはウェブサイト)の管理画面で、「設定」→「全般」メニューを選び、「全般設定」のページを開きます。
  • 「モジュール設定」の「モジュールのキャッシュ」の部分で、「再構築の速度向上のために、テンプレートモジュール毎のキャッシュ設定を有効にする」のチェックをオンにします。
  • 「サーバーサイドインクルード」の部分で「PHPのインクルード」を選びます。
  • 「変更を保存」ボタンをクリックして、設定を保存します。

テンプレートモジュールのキャッシュとPHPによるインクルードを行うための設定

2.作業手順の概要

今取り上げている例では、「ブログ記事と同じカテゴリに属するの記事一覧」のウィジェットを、キャッシュできるようにしたいです。

「ブログ記事と同じカテゴリに属するの記事一覧」は、ブログ記事が属するカテゴリごとに、異なった内容になります。
このように、同じテンプレートモジュールでも、状況によって出力される結果が異なる場合は、テンプレートモジュールまたはウィジェットをインクルードする側で、状況を表すための値(キャッシュのキー)を指定する必要があります。

今取り上げている例だと、カテゴリごとに出力が異なります。
そこで、キャッシュのキーとして、カテゴリのIDなど、カテゴリごとに異なる値を指定するようにします。

ただ、ウィジェットをウィジェットセットに組み込む一般的なの使い方では、キャッシュのキーを指定することができません。
そこで、回りくどい方法になりますが、以下のような手法を取ります。

  • 1.ウィジェットにしたい部分(今取り上げている例なら、「ブログ記事と同じカテゴリに属するの記事一覧」)をテンプレートモジュールにします。
  • 2.1.のテンプレートモジュールで、キャッシュとPHPによるインクルードを有効にします。
  • 3.ウィジェットを新規作成し、1.のテンプレートモジュールをインクルードするようにします。また、そのMTIncludeタグに、keyモディファイアを指定して、キャッシュのキーを指定します。
  • 4.3.のウィジェットをウィジェットセットに組み込みます。

3.テンプレートモジュールの作成

まず、「ブログ記事と同じカテゴリに属するの記事一覧」を出力するために、テンプレートモジュールを作ります。

3-1.テンプレートの内容

Movable Type標準のクラシックブログテーマなら、以下のようなテンプレートを組むと良いでしょう。

<mt:EntryPrimaryCategory><$mt:CategoryLabel setvar="cat_label"$></mt:EntryPrimaryCategory>
<div class="widget">
    <h3 class="widget-header"><$mt:GetVar name="cat_label"$>カテゴリの記事</h3>
    <div class="widget-content">
    <mt:Entries category="$cat_label">
        <mt:EntriesHeader>
        <ul>
        </mt:EntriesHeader>
            <li><a href="<$mt:EntryPermalink$>" title="<$mt:EntryTitle remove_html="1" encode_html="1"$>"><$mt:EntryTitle$></a>
        <mt:EntriesFooter>
        </ul>
        </mt:EntriesFooter>
    </mt:Entries>
    </div>
</div>

1行目の文で、ブログ記事のメインカテゴリの名前を、変数cat_labelに代入します。
そして、5行目のMTEntriesタグのブロックで、そのカテゴリのブログ記事一覧を出力しています。

3-2.キャッシュとPHPインクルードの設定

次に、「テンプレートの設定」の部分を開き、以下の設定を行います。

  • 「PHPのインクルードとして処理する」をオンにします。
  • 「モジュールのキャッシュ」の部分で、「作成または更新後に無効にする」をオンにし、「ブログ記事」と「カテゴリ」のチェックをオンにします。

キャッシュとPHPインクルードの設定

設定が終わったら、テンプレートモジュールを保存します。
テンプレートモジュールの名前は、「同一カテゴリ記事リスト」にします。

4.ウィジェットの作成

次に、「ブログ記事と同じカテゴリに属するの記事一覧」を出力するウィジェットを作成します。
ウィジェットを新規作成して、以下のように入力します。

<mt:If name="entry_template">
  <mt:EntryPrimaryCategory>
    <mt:SetVarBlock name="cache_key">cat_entries_<$mt:CategoryID$></mt:SetVarBlock>
  </mt:EntryPrimaryCategory>
  <$mt:Include module="同一カテゴリ記事リスト" key="$cache_key"$>
</mt:If>

1行目のMTIfタグで、ブログ記事アーカイブテンプレートにこのウィジェットを組み込んだ時のみ、ウィジェットが動作するようにします。
2~4行目で、「cat_entries_カテゴリのID」のような値のキャッシュのキーを生成し、変数cache_keyに代入しています。
そして、5行目のMTIncludeタグで、keyモディファイアに変数cache_keyの値を指定して、カテゴリごとにキャッシュを作り分けるようにしています。