年別記事一覧をさらにカテゴリ別に分類する

MTOS活用テクニック―カスタムフィールドで本格的なCMS機能を実現!

mixiのMovable Typeのコミュニティで、以下のような質問を見かけました。

年間にあったブログ記事をカテゴリ単位で一覧表示できないかなと考えています。

拙著の「MTOS活用テクニック」の中で、ブログ記事をさまざまな方法で検索する「SearchEntries」というプラグインを紹介しています。
このプラグインを使うと、上記のようなことも可能です。
その方法を紹介します。

年別/カテゴリ別のアーカイブページのサンプル

1.うまくいかない考え方

あげられた問題は、一見すると、MTArchiveList/MTTopLevelCategories/MTEntriesタグを組み合わせて、以下のようなテンプレートで出力できそうに思えます。

<mt:ArchiveList archive_type="Yearly">
    年などを出力
    <mt:TopLevelCategories>
        <mt:IfNonZero tag="CategoryCount">
        カテゴリ名などを出力
            <mt:Entries>
                カテゴリ内のブログ記事を出力
            </mt:Entries>
        </mt:IfNonZero>
        <$mt:SubCatsRecurse$>
    </mt:TopLevelCategories>
</mt:ArchiveList>

ところが、実際にはこの方法ではうまくいきません。
MTTopLevelCategories(およびMTSubCategories)タグの中でMTEntriesタグを使うと、MTArchiveListタグのコンテキストに関係なく、カテゴリ内のすべてのブログ記事が出力されるようになっています。

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

ここで、拙作のSearchEntriesプラグインを使います。
SearchEntriesプラグインは、さまざまな条件を指定して、ブログ記事を検索して読み込む機能を持っています。

プラグインは以下からダウンロードします。

SearchEntries_1_05.zip

プラグインの継続的な開発やサポートのために、プラグインをご利用された方は、ドネーション(寄付)を行っていただけると幸いです。
ドネーションの方法は、こちらのページをご参照ください。

また、このプラグインの他にも、いくつかのプラグインを配布しています。
配布中のプラグインは、Movable Type Plugin Directoryのページをご参照ください。

Movable Typeのプラグイン開発等のドキュメント「Movable Type Developer's Guide Volume 1」も販売しています。
ご自分でプラグインを作ってみたい方に、ぜひお勧めしたい一冊です。
詳細は特設ページをご覧ください。

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

3.SearchEntriesプラグインを使ってテンプレートを書き換える

1.であげたテンプレートを、SearchEntriesプラグインを使って、希望の動作になるように書き換えると、以下のようになります。

<mt:ArchiveList archive_type="Yearly">
    <mt:ArchiveDate format="%Y%m%d%H%M%S" setvar="archive_start">
    <mt:ArchiveDateEnd format="%Y%m%d%H%M%S" setvar="archive_end">
    年などを出力
    <mt:TopLevelCategories>
        <$mt:CategoryId setvar="cat_id">
        <mt:SearchConditions>
            <mt:SearchConditionCompare field="authored_on" ge="$archive_start" le="$archive_end">
            <mt:SearchConditionCategorySection>
                <mt:SearchConditionCategoryId include_cat_ids="$cat_id">
            </mt:SearchConditionCategorySection>
        </mt:SearchConditions>
        <mt:IfNonZero tag="SearchFoundEntryCount">
        カテゴリ名などを出力
        <mt:Entries>
                カテゴリ内のブログ記事を出力
        </mt:Entries>
        </mt:IfNonZero>
        <$mt:SubCatsRecurse$>
    </mt:TopLevelCategories>
</mt:ArchiveList>

2行目と3行目で、年の最初/最後の日付を、変数archive_start/archive_endに代入します。
また、6行目で、カテゴリのIDを変数cat_idに代入します。
そして、7~12行目で日付とカテゴリIDを条件に記事を検索して、その結果を15~17行目で出力しています。

なお、SearchEntriesプラグインは多機能で、すべてを紹介すると相当な分量になります。
拙著「MTOS活用テクニック」に使い方を解説していますので、詳しく知りたい方は、ぜひこの本をお買い求めください。