2006年2月 3日

ブログ(MovableType)の個別ページに、Javascriptで最新記事を表示

カテゴリ毎の最新記事を、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で組み込まれます。

FirefoxScreenSnapz069.png

あとは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>

とするともう少しスマートになりますね。

Posted by: (o) at 2006年2月 3日 11:48

お〜そんな方法がありましたか!

Posted by: Jun Kaneko at 2006年2月 3日 14:24

一つのエントリーに複数のカテゴリーを指定していると、表示されない問題はどう解決したら良いのかと悩んでいます。
いろいろ試したけれどもダメでした。

Posted by: yosshies at 2006年2月 3日 20:54

おっと、なるほど。個別アーカイブに貼付ける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>

Posted by: Jun Kaneko at 2006年2月 3日 21:25

たいへんありがとうございます。
少し間違えてしまって手間取りましたが、無事動きました。
感謝感激です。
よって、「確認済」ということでいいかと思います。

Posted by: yosshies at 2006年2月 4日 00:56

初めまして、こんばんは。
「カテゴリの最新記事を表示」を私のブログに
使わせていただきました。
ありがとうございました。
アニメーションの方も面白そうなので
試してみようと思っています。
これからもよろしくお願いします。

Posted by: ヨンシマイ at 2006年7月29日 00:18

こんにちは。最新記事の表示とアニメーションを組み合わせた表示が可能な方法も、丁度アップしましたので、よければこちらもご覧ください〜

http://www.goodpic.com/mt/archives2/2006/08/prototypejs_mov.html

Posted by: Jun Kaneko at 2006年8月12日 18:16

こんにちは。記事参考ありがとうございます。
早速やってみたのですが、なぜか
エントリー記事のページで表示されませんでした。
何か私のやり方がおかしかったのでしょう。
また、挑戦してみます。
prototypejsの方は最新のものをダウンロードして
サーバーにアップしておきました。
なので、以前の記事の方がうまくでているので
そちらを当面使っていきます。

大変気に入っています。ありがとうございます!
それと、G-Toolsに登録しました。
すごい機能ですね。マイ・ショップうれしいです。
使い勝手もよくすばらしいですね。
AWSにも登録して、ますますできることが広がってきました。
あわせてありがとうございました。

Posted by: ヨンシマイ at 2006年9月 3日 18:15

英語だけのコメントは、スパムフィルターではじかれてしまうので、日本語でのコメントをお願いします。

追加情報(必須ではありません)

(ページには表示されません)

Yes No

トラックバック

トラックバックURL

ブログ記事の情報

このページへのリンク

このブログを

作成日 : 2006年2月 3日 00:04