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プラグインは、さまざまな条件を指定して、ブログ記事を検索して読み込む機能を持っています。
プラグインは以下からダウンロードします。
プラグインの継続的な開発やサポートのために、プラグインをご利用された方は、ドネーション(寄付)を行っていただけると幸いです。
ドネーションの方法は、こちらのページをご参照ください。
また、このプラグインの他にも、いくつかのプラグインを配布しています。
配布中のプラグインは、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活用テクニック」に使い方を解説していますので、詳しく知りたい方は、ぜひこの本をお買い求めください。





![Hardcore Will Never Die, But You Will [Disc 2] Hardcore Will Never Die, But You Will [Disc 2]](http://userserve-ak.last.fm/serve/34s/71241534.jpg)
![Hardcore Will Never Die, But You Will [Bonus Tracks] Hardcore Will Never Die, But You Will [Bonus Tracks]](http://userserve-ak.last.fm/serve/34s/67192634.jpg)





コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。
記事違いで申し訳ございません。
『MTOS活用テクニック』を購入し、勉強しているのですが、どうしても分からないのでご教示頂けたら幸いです。
カテゴリーやブログ(管理画面)にテキストのフィールドを追加する場合、「テンプレートタグの値を出力するサブルーチン」の「return」の部分はどのように記述したらいいのでしょうか。
ブログ記事に追加する場合は「or return $ctx->_no_entry_error();」となっております。
この部分のカテゴリーやブログ(管理画面)にテキストフィールドを追加する場合の記述が知りたいのです。
何卒よろしくお願いいたします。
「MTOS活用テクニック」をお買い求めいただき、ありがとうございます。
カテゴリーやブログにフィールドを追加する方法は、それぞれ本の105ページ/119ページで解説しています。
それぞれの部分に、テンプレートタグを出力するサブルーチンの書き方もありますので、そちらを参照してください。
早速の返信ありがとうございます。
例えばブログ(管理画面)にテキストフィールドを2つ追加する場合、2個目のプラグインをアップしログインしようとすると「Can't call method "execute" on an undefined value」と表示されエラーとなります。(プラグイン1個であれば問題ありません。)
122ページ目の「return '' unless $blog;」部分を削除すると2個とも動作するので、この部分がエラーの原因かと思っている次第です。
ブログ記事ならば「or return $ctx->_no_entry_error();」が使われているのでテキストフィールドの場合は「return '' unless $blog;」とは違うのかと思いご教示をお願いいたしました。
よろしくお願いいたします。
こんにちは。
ご質問の件ですが、メールフォーム(http://www.h-fj.com/blog/mailform.php)から、作られたプラグインのソースコードを送っていただけないでしょうか。