アーカイブの制御(その10・アーカイブページを部分的に出力しない)

サイトによっては、アーカイブページを部分的に出力したくないこともあり得ます。
例えば、以下のような例が考えられます。

  • サイトには「新着情報」と「商品情報」のカテゴリがあります。
  • 「新着情報」カテゴリでは、月別のアーカイブページを出力します。
  • 「商品情報」のカテゴリでは、月別のアーカイブページは出力しません。

今日は、プラグインを利用して、アーカイブページの再構築を部分的に行わないようにする方法を紹介します。

1.build_file_filterについて

Movable Typeの通常の再構築では、アーカイブテンプレートの再構築は、すべてのブログ記事を対象にして行われます。
ところが、Movable Typeの内部の「build_file_filter」という仕組みを使うと、再構築を部分的に抑止することができます。

build_file_filterは、各ページの再構築を始める前に、Movable Typeがプラグインに対して「再構築しても良い?」と尋ねる仕組みです。
ここで、プラグインが「再構築するな」という返事をすると、そのページは再構築されなくなります。

2.NoRebuildプラグインのインストール

build_file_filterを利用するためのごくシンプルなプラグインとして、「NoRebuild」を作りました。
以下からダウンロードすることができます。

NoRebuid_1_00.zip

ダウンロードしたZipファイルを解凍すると、「NoRebuild」というフォルダができます。
このフォルダを、Movable Typeの「plugins」ディレクトリにアップロードします。

また、このプラグインをインストールすると、ファイル名に「*no_rebuild*」を含むページは、再構築されないようになります。

3.事例

以下のような事例を元に、NoRebuildプラグインを使う方法を解説します。

  • ブログのIDは1番です。
  • サイトには「新着情報」と「商品情報」のカテゴリがあります。
  • 「新着情報」カテゴリの記事は、月別のアーカイブページを出力します。
    アーカイブページのファイルの名は「カテゴリ/サブカテゴリ/年/月/index.html」にします。
  • 「商品情報」のカテゴリの記事は、月別のアーカイブページは出力しません。

3-1.カテゴリ月別アーカイブの作成

この事例を実現するには、以下の手順を取ります。

  • カテゴリ別に月別のアーカイブページを出力するようにします。
  • アーカイブのパスを設定し、「商品情報」カテゴリの月別ページの出力ファイル名を「*no_rebuild*」に変えて、再構築されないようにします。

まず、アーカイブマッピングを新規作成して、カテゴリ月別アーカイブを出力できるようにします。

Movable Type 4.2の標準のテンプレートセットだと、「カテゴリ別ブログ記事リスト」というアーカイブテンプレートがあります。
このテンプレートを元に、カテゴリアーカイブが出力されています。
このテンプレートにアーカイブマッピングを追加して、カテゴリ月別アーカイブも出力できるようにします。

カテゴリ月別アーカイブのアーカイブマッピングの追加

3-2.アーカイブのパスを決めるためのテンプレートモジュールを作成

次に、アーカイブのパスの設定を変えて、、「商品情報」カテゴリの月別ページの出力ファイル名が「*no_rebuild*」になるようにします。
以前に、アーカイブのパスにMTIncludeタグを使う方法を紹介しましたが、この方法を利用します。

まず、パスを出力するためのテンプレートモジュールを作ります。
今取り上げている例だと、以下のようにすると良いでしょう。
また、テンプレートモジュールの名前は、「カテゴリ月別アーカイブのパス」等にしておくとよいでしょう。

<mt:ApplyModifier trim="1">
    <$mt:CategoryLabel setvar="cat_label">
    <mt:If name="cat_label" eq="新着情報">
        <$mt:FileTemplate format="%c/%y/%m/%i"$>
    <mt:Else name="cat_label" eq="商品情報">
        *no_rebuild*
    </mt:If>
</mt:ApplyModifier>

このテンプレートモジュールでは、2行目のタグで、カテゴリの名前を変数cat_labelに代入しています。
3行目のMTIfタグで、カテゴリの名前が「新着情報」であるかどうかを調べ、その条件が成立している場合は、4行目によってアーカイブのファイル名が「カテゴリ/サブカテゴリ/年/月/index.html」になります。
また、5行目のMTElseタグでは、カテゴリの名前が「商品情報」であるかどうかを調べ、その条件が成立している場合は、6行目によって、アーカイブのファイル名が「*no_rebuild*」になります。

3-3.アーカイブのパスの設定

最後に、アーカイブのパスの設定を変えます。

「カテゴリ別ブログ記事リスト」のアーカイブテンプレートを開き、アーカイブマッピングの部分を編集する状態にします。
そして、「カテゴリ-月別」のパスの部分で「カスタム」を選び、以下を入力します。

<$mt:Include module="カテゴリ月別アーカイブのパス" blog_id="1"$>

アーカイブのパスの設定

これによって、カテゴリ月別アーカイブの個々のページのファイル名は、「カテゴリ月別アーカイブのパス」のテンプレートモジュールによって決まるようになります。
そして、「商品情報」カテゴリのカテゴリ月別アーカイブのファイル名が「*no rebuild*」になります。
最終的に、NoRebuildプラグインの効果によって、「商品情報」カテゴリ月別アーカイブは出力されなくなります。