我的 Blog 大多都是一些個人筆記,有參考性的筆記除了分享給大家看,連自己有需要時三不五時也要來回顧和參考一番。不過因時制宜,有些東西總會因為時間變化而些要作調整,尤其像之前關於 LinkStation 的改機資訊,也因為機器變動、軟體和參考下載的網址有更新,所以在閱讀筆記的時候,不時也會一併更新已經失效和變更的部份。Blogger 顯示的文章時間,用的是「發表時間」,也就是說文章一旦公開,發表的日期和時間就不會變了(除非手動修改發表時間),這樣方便文章排列時依發表前後順序來整理,但也因為這樣,哪天如果有修改過這篇文章、想標示文章最後更新的時間,只好手動在文章裡告知了!(因為 Blogger 的樣板變數,Post 裡只有發表的 timestamp,並沒有更新的時間..)
不過之前在處理 Feed 內容的時候,有注意到 Feed Content 裡除了有文章的發表時間 (published),也還有更新時間 (updated) 啊,所以只要能透過該篇文章的 Feed 內容,就可以找出該篇文章最後的更新時間,把它抓出來用不就能達到目的了嗎?從 Feed 透過 JSON 抓資料顯示是小事,但遇到的障礙有兩個,首先,現在有的 Feed 標準是「全部文章」、或「全部留言」的資訊,我要的只是單篇文章的 Feed 內容,不會要我從全部文章的 Feed 來搜尋吧?其次,就算找到單篇文章的 Feed 資料,裡面的格式又為何(會這麼說,是因為和 Google 公告的格式不大一樣)?經過幾天的奮鬥,終於讓我解決問題做出這個 Hack,由於部份用法都不在官方的說明文件裡,所以格外花時間(在確定資料內容)。
顯示文章最後的更新時間
首先是單篇文章的 Feed 網址格式。之前找到的資料,Feed 的種類有 Posts Feed (所有文章)、Comments Feed (所有留言)、Labels Feed、還有 Post Comment Feed (單篇文章的所有留言),單純一篇文章的 Feed 其實沒什麼用(而且需要先找出 Post ID),找半天好不容易被我 try 出來,單篇文章的 Feed 網址是:
http://xxx.blogspot.com/feeds/posts/default/POST-ID
有了 Feed 就簡單啦,接下來用 JSON 來抓 Post 的 Update Time。根據 JSON 的 Parse 規則,Update Time 的變數是 json.feed.entry[i].updated.$t,不過我是單篇文章啊,沒有一堆 Feed Entry,所以資料結構和一般的 Feed 又不一樣啊!後來透過直接解讀該 Feed 的內容、並用 JSON 的規格來判斷,才知道該變數應該是 json.entry.updated.$t 啊!解決這兩個關鍵的問題,要顯示文章更新時間就一如反掌了!看不懂的人沒關係,一樣複製、貼上、修改就能用這個功能了。打開管理介面、版面配置、修改 HTML 樣板原始碼(一樣要展開小程式範本),在程式碼 <head> 區段內(</b:skin> 標籤後、</head> 標籤前),塞入 Javascript 程式:
<script type='text/javascript'>
//<![CDATA[
<!-- Function used for generating the last update time for each post: showPostUpdateTime() -->
function showPostUpdateTime(json) {
var updateTime = json.entry.updated.$t;
var publishTime = json.entry.published.$t;
if (updateTime.substr(0,10) != publishTime.substr(0,10))
document.write(' | 更新於 '+updateTime.substr(0,10)+' '+updateTime.substr(11,5));
}
//]]>
</script>
說明一下,這段 Javascript 的工作原理是:先取得該文章的「發表時間」和「更新時間」,如果「日期」一模一樣,那麼就不顯示更新時間(因為我覺得,在發表文章的同一天內對內容做一點修改無可厚非,可能只是打錯字)。如果日期不一樣,那麼就顯示該文章最後更新的日期和時間。(如果要改顯示格式、內容和判斷規則的,自己修改這段 Javascript,不要再來找我客制化了!)
接下來,要把觸發以上 Javascript 的函式呼叫塞到原始碼裡,這裡主要也是決定這段更新時間要顯示的位置。以這的範例來看,我把最後更新時間放在「發表時間」的後面,而且,只有在顯示該篇文章全文的時候,才會顯示出來(所以首頁看不到,判斷規則可以參考這篇文章)。所以先找到顯示發表時間 (<data:post.timestamp/>) 的區段,插入紅色的那個程式:
<span class='post-timestamp'>
<b:if cond='data:top.showTimestamp'>
<data:top.timestampLabel/>
<b:if cond='data:post.url'>
<a class='timestamp-link' expr:href='data:post.url' title='permanent link'><data:post.timestamp/></a>
<!-- Fixed for display post update time -->
<b:if cond='data:blog.pageType == "item"'>
<script expr:src='"/feeds/posts/default/" + data:post.id + "?alt=json-in-script&callback=showPostUpdateTime"' type='text/javascript'/>
</b:if>
</b:if>
</b:if>
</span>
那個 if 的判斷句就是檢查是不是「顯示文章全文」的狀態,如果到處都想看到「更新時間」,那麼把該 if 判斷拿掉就行了。
會想加這項資訊,主要也是想標示文章最後的更新時間,自己在整理筆記時,才知道上次更新的時間,閱讀時也能知道這篇是不是 Po 完就沒動過的舊文章,對於值得一看再看或會修改的文章,這項資訊很有參考價值,對於愛 Po 流水帳、或是 Po 完連自己都不一定會再看的 Blog 來說,這項功能就完全用不到囉~
回應: 22