2007-03-06

最新文章的加強版:其他的最新文章 (Other Recent Posts)

原來提過的「最新文章」模組,很單純是抓 Feed 裡面的資料,根據排序之後列出最前面的幾篇,不過在首頁顯示的時候有個問題,首頁不就已經顯示了最新文章嗎?假設你設定首頁列出十篇文章,「最新文章」模組裡面的標題也列出最新十篇,這不是都一樣嗎?這個模組放在首頁就很好笑了~我的加強版很簡單,主要有兩個部分,第一,把這塊模組放在 Blog 文章模組的下面,第二,修改之前的程式碼,只列出首頁沒出現的最新文章標題。

第一個問題,Blogger 除了提供範本原始碼 (Template HTML) 修改,另外也提供「網頁元素」一個視覺化的模組管理介面,如果想在 Blog 文章下面新拉一個模組(加入網頁元素),預設是不行的。不過呢只要偷改一下原始碼,把限制拿掉就可以了。打開範本的原始程式碼,原來 Blog 文章所在的區塊程式碼應該是這樣:

<div id='main-wrapper'>
<b:section class='main' id='main' showaddelement='no'>
<b:widget id='Blog1' locked='true' title='blog 文章' type='Blog'>
............. (以下略過不表)

顧名思義,把上面紅色那段刪除,Blog 文章所在的 Section 才能夠新增「網頁元素」。儲存後回到範本的網頁元素分頁,接著就可以在 Blog 文章所在的上方點選「加入網頁元素」了!接下來解決第二個問題,可以參照我之前的文章,不過為了「最新文章」和「最新回應」兩個模組可能衝突的問題,我另外更改了函示和部分變數的名稱。首先加入一個新的 HTML/Javascript 元素,填入下面的程式碼:

<div id="newPosts">
  Loading...
  <noscript>failed!<br/>Javascript not supported here!</noscript>
</div>

<script>
function handlePosts(json) {

  function compareentry(a,b) {
    order= Date.parse(a.published.$t.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/, '$1/$2/$3 $4 GMT')) - Date.parse(b.published.$t.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/, '$1/$2/$3 $4 GMT'));
    return 0-order;
  }
 
  var temp = '<ul>';
  var PostShow = 10;
  var StartIndex = 5;
  var sortentry = json.feed.entry.sort(compareentry);
  if (json.feed.entry.length > StartIndex)
  {
    for (var i=StartIndex, Post; Post = sortentry[i]; i++) {
      if (i >= PostShow+StartIndex)
        break;
      var title=Post.title.$t;
      var j=0;
      while (j < Post.link.length && Post.link[j].rel != "alternate")
        j++;
      var link=Post.link[j].href;
      var timestamp=Post.published.$t.substr(0,10);
      temp += '<li><span class="item-title"><a href="'+link+'">'+ title +'</a> - '+timestamp+'</span></li>';
    }
  }
  else
    temp+="<li>No further post !</li>";
  temp+="</ul>";
  document.getElementById("newPosts").innerHTML = temp;
}
</script>

<script src="/feeds/posts/summary?orderby=published&alt=json-in-script&callback=handlePosts" type="text/javascript"/></script>

和之前不一樣的,我改了一些函示名稱和變數名字,主要是怕和最新回應模組衝突。我也加了一些修改,上述程式其中有兩個紅色變數,PostShow 指的是這個模組想要列出來的標題數量,而 StratIndex 指的是要從第幾篇開始表列。以我上面的範例來說,我在首頁只顯示五篇文章,而這個模組「應該」是顯示從第五篇之後的新文章標題,總共列出十個,所以設定就是上面這樣。另外補充的是,我希望這個「網頁元素」只出現在首頁,所以搭配另一篇文章提到的 Hack,讓我這個 Other Recent Posts 模組只會出現在首頁,裡面只顯示除了首頁五篇最新文章外的其他最新文章標題,這樣是不是比一般的「最新文章」模組來得合理多了?

回應: 17

William(迪漳爸爸) 提到...

多謝你的"最新文章的加強版"模組,正在使用中,但有些問題請教大大。

我在首頁會顯示十五篇文章,而又想這個模組顯示從第十五篇之後的新文章標題,總共列出三十個,不知怎樣設定呢?

因為現在我的新文章標題只能顯示十個,希望大大能指點一下!

Abin 提到...

To william: 上面的程式碼裡,不是有兩行紅字:
var PostShow = 10;
var StartIndex = 5;
意思就是:我的首頁會顯示五篇文章,透過這個模組 StartIndex 從 5 開始,然後顯示 10 篇文章。
以你的狀況,應該是把 StartIndex 後面的值改成 15,然後 PostShow 後面也改成 15,這樣就會從 15 篇開始 show,然後再 show 15 篇新文章 (總共 30 個)。
不過要注意一下,RSS Feed 會不會有上限限制,印象中不加參數 Feed 只會抓 20 篇,所以扣掉 15 篇 Feed 只剩 5 篇,你可以在 Feed 後面加參數 &max-results=30 修正這個狀況。

William(迪漳爸爸) 提到...

多謝大大的回應及指點,但我實在對程式碼認識有限。

你說「在 Feed 後面加參數 &max-results=30 修正這個狀況」,是在你的「最新文章模組」加入參數,還是直接修改我自己的範本 HTML ?

麻煩大大再次指教!

Abin 提到...

To william: 一樣在上面模組的程式碼裡,最後一行:
<script src="/feeds/posts/summary?orderby=published&alt=json-in-script&callback=handlePosts" type="text/javascript"/></script>
在 Feed 的 URL 裡加上參數,變成:
<script src="/feeds/posts/summary?orderby=published&alt=json-in-script&callback=handlePosts&max-results=30" type="text/javascript"/></script>
這樣 Feed 的內容就會顯示 30 篇了。

William(迪漳爸爸) 提到...

成功啦!多謝大大的耐心賜教!

Davin 提到...

Abin大大:
在您所寫"最新文章"的Javascript裡,有辦法可以像Neo所寫出的Javascript,有"下一頁"的選項,可以一直點選所有Blog裡的文章嗎?
而非只是單獨列出目前Javascript所設定的篇數...

因為如果在範本裡加裝Neo,很容易改壞掉原有的Template..

Abin 提到...

To Davin:
喔!你的建議感覺很不錯,有機會我會實作看看,成功的話再發表心得。
我看了 Neo 的程式碼,應該不難,網路上很多人直接套用,大多了無新意,還不是直接外引 .js 檔、用獨立的 Blog 模組。我初期的想法是把 fetch() 改成獨立的函式,放在樣板檔頭,這樣頁面裡的最新文章和最新回應同時都可以用,只要宣告一次,要用的時候再呼叫就好。
不過,我這樣的改法,應該難度更高,樣板更容易改爛,哈~ :P

Bryan 提到...

感謝Abin兄的教學。

請問在首頁裡如何隱藏「較舊的文章」連結?

Abin 提到...

To Bryan:
不大懂你所謂「較舊的文章」連結是什麼。首頁基本上是從最新的文章開始顯示、然後顯示你指定的篇數(假設是十篇),這十篇就是你的最新文章。
如果你的意思是,不想要顯示十篇,只想顯示五篇的話,你應該登入到 Blog 的設定頁面 -> 格式,最上面就是讓你「指定」顯示在首頁的文章數量。

Bryan 提到...

To Abin兄

抱歉,我的意思是在首頁下方的「訂閱文章」與「較舊文章」的連結。

因為我已加入最新文章的HACK,其中「訂閱文章」的連結,我已參閱隱藏或更改預設的 Feed Link予以移除。

但是「較舊文章」的連結還是存在於本文下方,顯得多餘。

另在讓側邊列 (Sidebar) 的元件只在首頁顯示/不顯示一文中,您有提到「有了以上的幾種判斷句,我想不只可以控制 Sidebar 上的元件在哪種頁面顯示,任何範本裡的功能或操作也可以搭配上述條件使用」,這才想請您協助解惑。

Abin 提到...

To Bryan:
我還是不懂你所謂「較舊文章」的連結是指什麼。
可以有範例的圖片或網址,更清楚地說明到底是哪個區塊?或,你用我首頁來做範例也行,是哪一個部份不想顯示,還有,這和本文「其他的最新文章」有關聯嗎?

Bryan 提到...

To Abin兄
請參閱圖例,我希望將「較舊的文章」的連結隱藏,就像您首頁一樣。但是其他頁面還是正常顯示。

謝謝您!

Abin 提到...

To Bryan:
喔~我終於知道了,因為我樣板裡早就拿掉那個玩意,所以你發問的東西我根本看不到,一時沒辦法聽懂你指的是什麼。
也因為我拿掉了,沒有當時修改前的原始碼備份,沒辦法很明確地告訴你怎麼改。
所謂的「較舊文章」連結其實是讓你走到「上一篇」,如果有更新的「下一篇」則是「較新文章」。這個切換上下篇的是用一個叫 blog-pager 的 div 區段處理,如果要整個拿掉,就找下面這一行:
<div class="blog-pager" id="blog-pager">
把整個 div 區段拿掉試試看。

Bryan 提到...

To Abin兄:
謝謝您關鍵性的提點。

我的作法是在div class='blog-pager' id='blog-pager'裡,加上了b:if cond='data:blog.url != data:blog.homepageUrl'的判斷句,如此便在首頁隱藏了新舊文章的連結。

而「Archive存檔頁面」與「Label標籤分類頁面」裡還是會正常顯示。

Tommy 提到...

有辦法寫成random post嗎?

Abin 提到...

To Tommy:
當然可以,只不過我沒需要。可以參考我另一篇「相關文章」的 Hack、裡面有隨機挑選文章的語法,那篇的作法是先找出相關的標籤、列出所有文章並剔除重複的部份,最後再從剩下的文章「隨機」挑幾篇當作相關文章,只要把隨機的部份挖出來、最新文章的尋範圍拉大,就可以做出類似效果,自己看著改吧。

DeDe 提到...

喔喔喔喔喔 老大這篇做得很棒阿
複製貼上照著做就能用真的好開心阿!!(轉圈)

張貼留言

歡迎留言或發表意見,不過要理性不做人身攻擊。匿名的朋友得到回應的速度會比較慢喔~
發問相關的禮貌和規矩請先參考這篇文章,不當留言、和本文無關的回應可能會被直接刪除無視喔!