TopMovable Typeカスタマイズコメント > ブログ記事とコメントをひとつのフィードで配信する
2010年8月27日

ブログ記事とコメントをひとつのフィードで配信する

Posted at August 27,2010 2:55 AM
Category:[エントリー, コメント]
Tag:[, , ]

Movable Typeで、ブログ記事とコメントをひとつのフィードにまとめて出力するカスタマイズを紹介します。

1.利用シーン

このフィードは、掲示板やFAQなどのような、コメント投稿の比重が高いサイトでの利用を想定しています。

例えばコミュニティ掲示板で、トピックに対するコメントをフィードで配信している場合、コメントしか購読できないと、元のトピックの内容が分かりません。元のトピックを読むには、表示されているコメントの元ページから辿るか、トピックを配信するフィードを別に購読する必要があります。次のキャプチャは、Firefox 3でフィードを表示したものです。

変更前
変更前のフィード

トピックとコメントをひとつのフィードにまとめて時系列に表示することで、掲示板全体の流れを購読することができます。

変更後
変更後のフィード

もちろん、通常のブログでも利用できます。

2.フィード用テンプレートの作成

フィード用のインデックステンプレートを作成します。

テンプレート名:トピックとコメント ※名前は何でも構いません
ファイル名:comments.xml
テンプレートの内容:以下

<$mt:HTTPContentType type="application/atom+xml"$><?xml version="1.0" encoding="<$mt:PublishCharset$>"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title><$mt:BlogName remove_html="1" encode_xml="1"$></title>
    <link rel="alternate" type="text/html" href="<$mt:BlogURL encode_xml="1"$>" />
    <link rel="self" type="application/atom+xml" href="<$mt:Link template="feed_recent"$>" />
    <id>tag:<$mt:BlogHost exclude_port="1" encode_xml="1"$>,<$mt:TemplateCreatedOn format="%Y-%m-%d"$>:<$mt:BlogRelativeURL encode_xml="1"$>/<$mt:BlogID$></id>
    <updated><mt:Entries lastn="1"><$mt:EntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></mt:Entries></updated>
    <mt:If tag="BlogDescription"><subtitle><$mt:BlogDescription remove_html="1" encode_xml="1"$></subtitle></mt:If>
    <generator uri="http://www.sixapart.com/movabletype/"><$mt:ProductName version="1"$></generator>
<mt:SetVar name="number" value="5" />
<mt:Entries lastn="$number">
<mt:EntryDate format="%Y%m%d%H%M%S" setvar="date" />
<mt:SetVarBlock name="feed_data{$date}">
<entry>
    <title><$mt:EntryTitle remove_html="1" encode_xml="1"$></title>
    <link rel="alternate" type="text/html" href="<$mt:EntryPermalink encode_xml="1"$>" />
    <id><$mt:EntryAtomID$></id>
    <published><$mt:EntryDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></published>
    <updated><$mt:EntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
    <summary><$mt:EntryExcerpt remove_html="1" encode_xml="1"$></summary>
    <author>
        <name><$mt:EntryAuthorDisplayName encode_xml="1"$></name>
        <uri><$mt:CGIPath encode_xml="1"$><$mt:CommunityScript encode_xml="1"$>?__mode=view&amp;blog_id=<$mt:BlogID$>&amp;id=<$mt:EntryAuthorID$></uri>
    </author>
    <mt:EntryCategories>
        <category term="<$mt:CategoryLabel encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#category" />
    </mt:EntryCategories>
    <mt:EntryIfTagged><mt:EntryTags><category term="<$mt:TagName normalize="1" encode_xml="1"$>" label="<$mt:TagName encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#tag" />
    </mt:EntryTags></mt:EntryIfTagged>
    <content type="html" xml:lang="<$mt:BlogLanguage ietf="1"$>" xml:base="<$mt:BlogURL encode_xml="1"$>">
        <$mt:EntryBody encode_xml="1"$>
        <$mt:EntryMore encode_xml="1"$>
    </content>
</entry>
</mt:SetVarBlock>
</mt:Entries>
<mt:Comments lastn="$number">
        <mt:CommentDate format="%Y%m%d%H%M%S" setvar="date" />
<mt:SetVarBlock name="feed_data{$date}">
<entry>
<mt:CommentEntry>
    <title>「<$mt:EntryTitle remove_html="1" encode_xml="1"$>」へのコメント</title>
    <link rel="alternate" type="text/html" href="<$mt:EntryPermalink encode_xml="1"$>" />
    <id><$mt:EntryAtomID$><$mt:CommentID$></id>
    <published><$mt:CommentDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></published>
    <updated><$mt:CommentDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
    <summary><$mt:CommentBody trim_to="60" remove_html="1" encode_xml="1"$>...</summary>
    <author>
        <name><$mt:CommenterUsername encode_xml="1"$></name>
        <uri><$mt:CGIPath encode_xml="1"$><$mt:CommunityScript encode_xml="1"$>?__mode=view&amp;blog_id=<$mt:BlogID$>&amp;id=<$mt:CommenterID$></uri>
    </author>
    <mt:EntryCategories>
        <category term="<$mt:CategoryLabel encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#category" />
    </mt:EntryCategories>
    <mt:EntryIfTagged><mt:EntryTags><category term="<$mt:TagName normalize="1" encode_xml="1"$>" label="<$mt:TagName encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#tag" />
    </mt:EntryTags></mt:EntryIfTagged>
    <content type="html" xml:lang="<$mt:BlogLanguage ietf="1"$>" xml:base="<$mt:BlogURL encode_xml="1"$>">
        <$mt:CommentBody encode_xml="1"$>
    </content>
</mt:CommentEntry>
</entry>
</mt:SetVarBlock>
</mt:Comments>
<mt:loop name="feed_data" sort_by="key reverse">
  <mt:if name="__counter__" le="$number">
<mt:GetVar name="__value__" />
  </mt:if>
</mt:loop>
</feed>

3.テンプレートの解説

作成したインデックステンプレートでは、まず、最新のブログ記事について、指定件数分、ハッシュ変数に設定します。同じように、最新のコメントについて、指定件数分、先程と同じハッシュ変数に設定します。ハッシュのキーにはブログ記事投稿時間、またはコメント投稿時間を利用します。設定後、ハッシュのキーを降順にソートして出力します。

フィード出力数は、次のMTSetVarタグで設定します。

<mt:SetVar name="number" value="15" />

また、フィード出力数とMTEntriesタグ、MTComentsタグのlastnモディファイアの値は変数numberを使って、すべて同数にしています。

<mt:Entries lastn="$number">
…中略…
</mt:Entries>
<mt:Comments lastn="$number">
…中略…
</mt:Comments>

例えばフィード出力数が「15」であれば、MTEntriesタグ、MTComentsタグのlastnモディファイアの値も「15」になります。こうしておけば、フィードの出力内容がブログ記事のみ、またはコメントのみになった場合でも不足なく表示されます。

収集したデータはMTLoopタグで出力します。

<mt:loop name="feed_data" sort_by="key reverse">
  <mt:if name="__counter__" le="$number">
<mt:GetVar name="__value__" />
  </mt:if>
</mt:loop>

変数numberを「15」にしておけば、最大15回繰り返します。

4.フィード用リンクの作成

次のような、フィード用リンクのウィジェットテンプレートを作成します。

<ul>
  <li><img src="<$mt:StaticWebPath$>images/status_icons/feed.gif" alt="購読する" width="9" height="9" /> <a href="<$mt:BlogURL$>comments.xml" title="購読する">すべての掲示板とコメント</a></li>
</ul>
Posted by yujiro   このページの先頭に戻る
関連記事
この記事を読んだ人はこんな記事も読んでいます
人気エントリー
Hatena Hot Entries
Hatena Entries
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字 イタリック アンダーライン ハイパーリンク 引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)

Now loading...
Introduction
Entries of this Category
Recent Entries
Recent Comments
Recent Trackbacks
QRcode

現在停止中です
携帯電話からこのQRcodeを撮影することで携帯用URLを取得することができます

URI for cellular phones
ギターに入った猫
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site
loading ...
Categories
Monthly Archives
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
クリエイティブ・コモンズ・ライセンス
Powered by
Movable Type 5.12