同一カテゴリブログ記事一覧の出力(その1・カテゴリアーカイブ活用版)

MTQに、「個々のブログ記事のサイドバーにその記事と同じカテゴリの記事一覧を出力するようにし、かつその部分をPHPでモジュール化したい」という質問が上がっていました。
その方法を紹介します。
今日は、カテゴリアーカイブテンプレートを追加する方法を紹介します。

1.考え方

個々のブログ記事に、その記事が属するカテゴリの記事の一覧を表示したいということは、よくあることです。
テンプレートタグをうまく組めば、そのようなことを行うことができます。

ただ、テンプレートタグだけでそのようなことを行うと、それぞれの記事を再構築するたびに、その記事が属するカテゴリの記事一覧を再構築することになります。
すると、再構築時間が記事数の二乗に比例するようになってしまい、記事数が増えると再構築時間が急激に長くなってしまいます。

ブログの各ページをPHPとして出力するようにしていれば、以下のような方法で、無駄な再構築を減らすことができます。

  • 1.個々のカテゴリごとに、そのカテゴリの記事一覧だけをファイルに出力するようにします。
  • 2.個々のブログ記事に、PHPのreadfile関数を使って、その記事のカテゴリに対応する1.のファイルを組み込みます。

2.カテゴリアーカイブテンプレートの追加

1つのテンプレートから、カテゴリごとに別々の出力を得るには、カテゴリアーカイブテンプレートを追加すれば良いです。
今取り上げている例なら、「ブログ記事リスト」のアーカイブテンプレートを追加して、それぞれのカテゴリに属する記事の一覧を出力するように、テンプレートを組みます。
例えば、クラシックブログテーマに沿ったHTMLを出力するなら、以下のようなテンプレートを組むと良いでしょう。

<div class="widget">
    <h3 class="widget-header"><$mt:CategoryLabel$>カテゴリの記事</h3>
    <div class="widget-content">
    <mt:Entries>
        <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>

そして、アーカイブマッピングを設定して、個々のカテゴリごとにファイルが出力されるようにします。
例えば、ブログの出力先ディレクトリ→「cat_entries」ディレクトリの中に、「カテゴリのID.html」のようなファイル名で出力するなら、以下の手順でアーカイブマッピングを設定します。

  • 「テンプレートの設定」の部分を開きます。
  • 「新しいアーカイブマッピングを作成」のリンクをクリックします。
  • 「種類」の箇所で「カテゴリ」を選び、「追加」ボタンをクリックします。
  • アーカイブマッピングが追加されるので、「パス」の欄で選択肢の最後にある「カスタム」を選びます。
  • パスを入力する状態になるので、「cat_entries/<$mt:CategoryID$>.html」と入力します(以下の画面)。

アーカイブマッピングの設定

3.ウィジェットの追加

次に、ブログ記事と同じカテゴリの記事一覧をサイドバーに出力するために、ウィジェットを追加します。

ウィジェットでは、PHPのreadfile関数を使って、2.で出力したファイルを読み込むようにします。
readfile関数で読み込むファイルは、2.のアーカイブマッピングの設定に合わせるようにします。

例えば、2.で行ったように、ブログの出力先ディレクトリ→「cat_entries」ディレクトリの中に、「カテゴリのID.html」のようなファイル名で、カテゴリごとのブログ記事一覧のファイルを出力したとします。
この場合、ウィジェットを以下のように組んで、ブログ記事のメインカテゴリと同じカテゴリの記事一覧を読み込むようにします。

<mt:If name="entry_template">
  <?php readfile('<$mt:BlogSitePath$>cat_entries/<mt:EntryPrimaryCategory><$mt:CategoryID$></mt:EntryPrimaryCategory>.html'); ?>
</mt:If>

なお、1行目のMTIfタグは、ブログ記事のテンプレートを再構築する時のみ、このウィジェットを組み込むようにするための記述です。

ここまでが終わったら、今作ったウィジェットをウィジェットセットに組み込みます。
そして、ブログ全体を再構築します。