ブログ記事作成ユーザの出力を属性値つきで
MTEntryAuthorLinkなど記事作成者とリンク出力のテンプレートタグに任意の属性値をつけて出力するためのメモです
とっくにどなたかおこなわれていそうな気がいたしますが、エントリの作成者へのリンクにrel="me"をつけた形で出力するときの例をみていきます(rel属性以外でもあてはまるのですが、直接テンプレートタグから出力される要素に任意の属性を指定する例を他におもいつかなかったので)。
ところで元ネタですが、Googleよりエントリの執筆者名を検索エンジンに伝える為の属性が6月に発表されていました(参考まで)。
MTEntryAuthorLinkを用いない場合
このページは、<a href="<$mt:EntryAuthorURL$>" rel="me"><$mt:AuthorDisplayName$></a>が<$mt:EntryDate format="%x %X"$>に書いたブログ記事です。
MTEntryAuthorURLと、MTAuthorDIsplayNameとの組み合わせでリンクを作るというものです。
番組の途中ですが、(rel=author|rel=me)についての情報を探していましたところ、Google+のプロフィールへのリンクを貼っておくだけでよしなにしてくれるとの情報がありました。
とか。
とか。ということで、すでにネタが破綻しているのですが、以下にregex_replaceを使って変更する例をあげておきます。
MTEntryAuthorLinkをregex_replaceで置換して出力する
このページは、<mt:EntryAuthorLink regex_replace='/(<a href=.+")>/','$1 rel="me">'>が<$mt:EntryDate format="%x %X"$>に書いたブログ記事です。
但し、ニックネームやウェブサイトのURLであらゆる文字列での出力結果までは検証してませんのであしからず。置換がうまくいかなかった場合に、リンク生成に失敗しておかしな出力になる可能性があります(ダイナミックパブリッシングではいちおう期待通りというか、スタティックの時と同様に出力されていました。以上確認はMTOS5.12による)。
属性をhrefより前に配置したいとか、確実なほうでいきたいときは前者の方法がいいかもしれません
MTで記事に指定したタグをもとにDeliciousのタグフィード情報を得る
Movable Typeで記事に指定しているタグに基づいて、自分のDeliciousアカウントから同一のタグのフィードの情報をGoogle AJAX Feed APIを使って取得してみます。
基本的なところとして、DeliciousのフィードのAPIをおさえておきます。
自分のアカウント(ここで提示するコード上では、{your Delicious account})の特定タグのフィードを得るAPIは以下のようになっています。
http://feeds.delicious.com/v2/rss/{your Delicious account}/{TagName}
タグが設定された記事を想定するので、表示のコード一式をMTEntryIfTaggedで囲みます。
<mt:EntryIfTagged>
<mt:SetVarBlock name="entryTagArray">
<mt:EntryTags glue=",">
<mt:TagName>
</mt:EntryTags>
</mt:SetVarBlock>
<script type="text/javascript" src="http://www.google.com/jsapi?key={your api key}"></script>
<script type="text/javascript">
var feedBase='http://feeds.delicious.com/v2/rss/{your Delicious account}/';
google.load("feeds", "1");
function OnLoad() {
// create a feed control
var feedControl = new google.feeds.FeedControl();
feedControl.setNumEntries(10);
var tagsArray = "<$MTGetVar name="entryTagArray" strip_linefeeds="1" regex_replace="/[ ]+/g",""$>".toLowerCase().split(",");
for (var i=0; i<tagsArray.length; i++){
feedControl.addFeed(feedBase + encodeURIComponent(tagsArray[i]), tagsArray[i])
}
feedControl.draw(
document.getElementById("feedContent"),
{
drawMode : google.feeds.FeedControl.DRAW_MODE_TABBED,
});
}
google.setOnLoadCallback(OnLoad);
</script>
<mt:EntryIfTagged>
Google APIの呼び出しをおこないます(key=のあとには自分のAPI keyをいれます。keyをつかわないときは、クエリなしの/jsapiどまりのURIで動作します)。
tagのArrayを作ります。サンプルではコードの視認性の理由で一旦変数に渡しています。
.split(",")をつけることで、配列としてあつかうようになります。これを配列の数だけまわして、feedControl.addFeed()を繰り返すことで複数のタグのフィードを登録するということをおこなっています。
toLowerCase()を使っているのはDeliciousでは大文字/小文字が区別はないようですので統一のためです。
feedControl.setNumEntries(Number)では、取得件数を指定しています。
上記のコードは、個別エントリテンプレートのhead要素内にいれておきます。
Feedの流し込み先に以下の部分を用意して再構築して完了です。サンプルではfeedContentというIDにFeedを入れるようになっています。
<div id="feedContent">loading...</div>
テストページは、以下にあります。
http://www.markdiary.com/sample/tag_to_deliciousfeed-test.html