カテゴリ毎の最新記事を、Javascriptで表示
ブログの個別記事ページには、検索エンジンなどから直接アクセスが来るので、できればそこに最新の記事へのリンクも表示したい。ただ、各記事は、静的なHTMLファイルとして保存されるので、javascript で動的に組み込むようにしてみます。
2006/8/12追記 : Prototype.jsを利用して、同じ機能を実現するスクリプトも書いたので、Prototype.jsなどを組み込めるかたは、そちらのやりかたがよいかもしれません。
JSONテンプレートの作成
カテゴリー毎の最新の記事情報を、JSON形式で出力し、個別記事でカテゴリを指定して表示します。まずはJSONを出力する、新しいMovableTypeテンプレートを作成。
「テンプレート」> 「新規テンプレート作成」で、「recent_entries.js」という新しいテンプレートを作成。
以下のようなコードで、JSONを自動生成します。配列を作る時に、 <MTEntriesFooter>を使うとよいとコメントで教えていただきました。エントリーは<MTEntries lastn='1'> のような形で「,(カンマ)区切り」をうまく表現できます。ただ、 <MTCategories> ではそのようなタグが使えなそうなので、最後に「"id" : "end"」という無理矢理な要素をつけておきます。配列が中途半端に終わっていると、FireFoxはOKなのですが、Safari や IEではエラーで実行できないようですね。
var newEntries = {
<MTCategories>
"<$MTCategoryID$>" : {
"id" : "<$MTCategoryID$>",
"label" : "<$MTCategoryLabel$>",
"links" : [
<MTEntries lastn='5'>
{"title" : "<$MTEntryTitle encode_js="1"$>"
,"url" : "<$MTEntryPermalink$>"
, "excerpt" : "<$MTEntryExcerpt encode_js="1"$>"}
<MTEntriesFooter> <MTElse>, </MTElse> </MTEntriesFooter>
</MTEntries>
]
},
</MTCategories>
"id" : "end"
}
HTMLを表示するファンクション
次に最新記事のリストをHTMLで出力する javascriptのfunction を記述。これは、上記のJSONと同じ、「recent_entries.js」に記述。
function showNewEntries(cat_id)
{
var myUl, myLi;
var result = 0;
myUl = document.getElementById("goodpic_new_entries");
for (var j = 0; j < newEntries[cat_id].links.length; j++)
{
myLi = document.createElement("div");
myLi.className = "section";
myLi.innerHTML = "<h3><a href=\""
+ newEntries[cat_id].links[j].url + "\">"
+ newEntries[cat_id].links[j].title + "</h3></a>"
+ "<p>" + newEntries[cat_id].links[j].excerpt
+ "</p>";
myUl.appendChild(myLi);
result++;
}
return result;
}
上記の二つをテンプレートで保存して、再構築。ブログのURL/recent_entries.js にJavascriptのコードが正しく出力されているのを確認。
個別記事へのJavascript 組み込み
最後に、個別記事にJavascriptを組み込みます。「テンプレート」>「アーカイブ」>「Individual Archive」テンプレート内の、更新記事を表示したい場所に以下のようなHTMLを記入。
<div id="goodpic_new_entries"></div> <script src="<MTBlogURL>recent_entries.js" type="text/javascript" language="javascript"> </script> <script type="text/javascript" language="javascript"> <!-- var cat_id = <MTEntryCategories><$MTCategoryID$></MTEntryCategories>; showNewEntries(cat_id); //--> </script>
2/3追記。複数のカテゴリを、一つの記事に指定している場合は、上記のコードだと動かないとの報告いただきました。以下のようなコードだと多分大丈夫かな?
<div id="goodpic_new_entries"></div> <script src="<MTBlogURL>recent_entries.js" type="text/javascript" language="javascript"> </script> <script type="text/javascript" language="javascript"> <!-- var cat_id = [<MTEntryCategories><$MTCategoryID$>,</MTEntryCategories>0]; showNewEntries(cat_id[0]); //--> </script>
Individual Archiveテンプレートを保存したら、一度、「すべてを再構築」します。そうすると、個別記事の上記のコードを組み込んだ場所に以下のようなHTML構造で、Javascriptで組み込まれます。
あとはCSSで、見栄えを調整。もちろん、HTMLを出力するJavascriptのファンクションを変更すれば、出力されるHTMLコードが変更できます。すべての記事ページを再構築しなくても、javascriptを変更するだけでOKです。このブログでも、すべての個別ページに、その記事のカテゴリ毎の最新記事を表示しています。script.aculo.usを使って、アニメーション処理などをつけるのもよし。クラスを指定するだけでアニメーションを適用する方法を、以前の記事で紹介しています。
Javascript(script.aculo.us)で、ブログをアニメーション・デザイン:Goodpic
ブックマーク & はてなスター
コメント
<MTEntries lastn="5">
{ "title" : "<$MTEntryTitle encode_js="1"$>",
"url" : "<$MTEntryPermalink$>",
"excerpt" : "<$MTEntryExcerpt encode_js="1"$>" }
<MTEntriesFooter><MTElse>,</MTElse></MTEntriesFooter>
</MTEntries>
とするともう少しスマートになりますね。
お〜そんな方法がありましたか!
一つのエントリーに複数のカテゴリーを指定していると、表示されない問題はどう解決したら良いのかと悩んでいます。
いろいろ試したけれどもダメでした。
おっと、なるほど。個別アーカイブに貼付けるHTMLを以下のようにしたらどうでしょう?
<div id="goodpic_new_entries"></div>
<script src="<MTBlogURL>recent_entries.js"
type="text/javascript" language="javascript">
</script>
<script type="text/javascript" language="javascript">
<!--
var cat_id = [<MTEntryCategories><$MTCategoryID$>,</MTEntryCategories>0];
showNewEntries(cat_id[0]);
//-->
</script>
たいへんありがとうございます。
少し間違えてしまって手間取りましたが、無事動きました。
感謝感激です。
よって、「確認済」ということでいいかと思います。
初めまして、こんばんは。
「カテゴリの最新記事を表示」を私のブログに
使わせていただきました。
ありがとうございました。
アニメーションの方も面白そうなので
試してみようと思っています。
これからもよろしくお願いします。
こんにちは。最新記事の表示とアニメーションを組み合わせた表示が可能な方法も、丁度アップしましたので、よければこちらもご覧ください〜
http://www.goodpic.com/mt/archives2/2006/08/prototypejs_mov.html
こんにちは。記事参考ありがとうございます。
早速やってみたのですが、なぜか
エントリー記事のページで表示されませんでした。
何か私のやり方がおかしかったのでしょう。
また、挑戦してみます。
prototypejsの方は最新のものをダウンロードして
サーバーにアップしておきました。
なので、以前の記事の方がうまくでているので
そちらを当面使っていきます。
大変気に入っています。ありがとうございます!
それと、G-Toolsに登録しました。
すごい機能ですね。マイ・ショップうれしいです。
使い勝手もよくすばらしいですね。
AWSにも登録して、ますますできることが広がってきました。
あわせてありがとうございました。