原來提過的「最新文章」模組,很單純是抓 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
多謝你的"最新文章的加強版"模組,正在使用中,但有些問題請教大大。
我在首頁會顯示十五篇文章,而又想這個模組顯示從第十五篇之後的新文章標題,總共列出三十個,不知怎樣設定呢?
因為現在我的新文章標題只能顯示十個,希望大大能指點一下!
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 修正這個狀況。
多謝大大的回應及指點,但我實在對程式碼認識有限。
你說「在 Feed 後面加參數 &max-results=30 修正這個狀況」,是在你的「最新文章模組」加入參數,還是直接修改我自己的範本 HTML ?
麻煩大大再次指教!
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 篇了。
成功啦!多謝大大的耐心賜教!
Abin大大:
在您所寫"最新文章"的Javascript裡,有辦法可以像Neo所寫出的Javascript,有"下一頁"的選項,可以一直點選所有Blog裡的文章嗎?
而非只是單獨列出目前Javascript所設定的篇數...
因為如果在範本裡加裝Neo,很容易改壞掉原有的Template..
To Davin:
喔!你的建議感覺很不錯,有機會我會實作看看,成功的話再發表心得。
我看了 Neo 的程式碼,應該不難,網路上很多人直接套用,大多了無新意,還不是直接外引 .js 檔、用獨立的 Blog 模組。我初期的想法是把 fetch() 改成獨立的函式,放在樣板檔頭,這樣頁面裡的最新文章和最新回應同時都可以用,只要宣告一次,要用的時候再呼叫就好。
不過,我這樣的改法,應該難度更高,樣板更容易改爛,哈~ :P
感謝Abin兄的教學。
請問在首頁裡如何隱藏「較舊的文章」連結?
To Bryan:
不大懂你所謂「較舊的文章」連結是什麼。首頁基本上是從最新的文章開始顯示、然後顯示你指定的篇數(假設是十篇),這十篇就是你的最新文章。
如果你的意思是,不想要顯示十篇,只想顯示五篇的話,你應該登入到 Blog 的設定頁面 -> 格式,最上面就是讓你「指定」顯示在首頁的文章數量。
To Abin兄
抱歉,我的意思是在首頁下方的「訂閱文章」與「較舊文章」的連結。
因為我已加入最新文章的HACK,其中「訂閱文章」的連結,我已參閱隱藏或更改預設的 Feed Link予以移除。
但是「較舊文章」的連結還是存在於本文下方,顯得多餘。
另在讓側邊列 (Sidebar) 的元件只在首頁顯示/不顯示一文中,您有提到「有了以上的幾種判斷句,我想不只可以控制 Sidebar 上的元件在哪種頁面顯示,任何範本裡的功能或操作也可以搭配上述條件使用」,這才想請您協助解惑。
To Bryan:
我還是不懂你所謂「較舊文章」的連結是指什麼。
可以有範例的圖片或網址,更清楚地說明到底是哪個區塊?或,你用我首頁來做範例也行,是哪一個部份不想顯示,還有,這和本文「其他的最新文章」有關聯嗎?
To Abin兄
請參閱圖例,我希望將「較舊的文章」的連結隱藏,就像您首頁一樣。但是其他頁面還是正常顯示。
謝謝您!
To Bryan:
喔~我終於知道了,因為我樣板裡早就拿掉那個玩意,所以你發問的東西我根本看不到,一時沒辦法聽懂你指的是什麼。
也因為我拿掉了,沒有當時修改前的原始碼備份,沒辦法很明確地告訴你怎麼改。
所謂的「較舊文章」連結其實是讓你走到「上一篇」,如果有更新的「下一篇」則是「較新文章」。這個切換上下篇的是用一個叫 blog-pager 的 div 區段處理,如果要整個拿掉,就找下面這一行:
<div class="blog-pager" id="blog-pager">
把整個 div 區段拿掉試試看。
To Abin兄:
謝謝您關鍵性的提點。
我的作法是在div class='blog-pager' id='blog-pager'裡,加上了b:if cond='data:blog.url != data:blog.homepageUrl'的判斷句,如此便在首頁隱藏了新舊文章的連結。
而「Archive存檔頁面」與「Label標籤分類頁面」裡還是會正常顯示。
有辦法寫成random post嗎?
To Tommy:
當然可以,只不過我沒需要。可以參考我另一篇「相關文章」的 Hack、裡面有隨機挑選文章的語法,那篇的作法是先找出相關的標籤、列出所有文章並剔除重複的部份,最後再從剩下的文章「隨機」挑幾篇當作相關文章,只要把隨機的部份挖出來、最新文章的尋範圍拉大,就可以做出類似效果,自己看著改吧。
喔喔喔喔喔 老大這篇做得很棒阿
複製貼上照著做就能用真的好開心阿!!(轉圈)
張貼留言
歡迎留言或發表意見,不過要理性、不做人身攻擊。匿名的朋友得到回應的速度會比較慢喔~
發問相關的禮貌和規矩請先參考這篇文章,不當留言、和本文無關的回應可能會被直接刪除或無視喔!