2012年4月24日 星期二

blogger相关文章hacker

Blog 文章一多,分類標籤的運用在找尋特定文章時就很重要。當有些讀者從外面的搜尋引擎或 RSS 連進來看 Blog 特定文章的時候,在文章的後面隨機列出一些相關文章的標題,一方面可以讓讀者找到更多對方可能會感興趣的 Post,另一方面也可以吸引讀者多去瀏覽自己其他的文章。Blogger 系統所有的文章都有靜態連結網址,看起來頁面內容並不是「動態」從資料庫抓出來的(除了那些要去即時收集的模組),所以在單篇文章的後面亂數挑出一些相關的文章表列出來,應該也不會太花時間。

原理其實很簡單,透過文章分類標籤的 RSS Feed,找出一些和該篇文章有相同標籤的文章,它們就是「相關文章」,然後亂數挑出幾篇,過濾內容將標題、連結和日期列出就大功告成了。在網路上找到了一些範例,其實不大滿意,因為有個 bug:相關文章應該是排除本文之外有相同分類標籤的文章,偏偏這些範例挑亂數的時候有可能會挑到本文,這樣就會看到相關文章模組內還有本文標題在裡面的奇怪情況(邏輯上是沒錯啦)。所以看到這些範例除了例行性會去修改增加可讀性外,還要自己去解決這個 Bug。這個 Hack 應該是我 Blog 最後一個大規模的修改,之後除了調整 CSS 和外觀外,差不多想弄得功能都弄完了~

老樣子,要修改之前要先備份樣版。首先,塞入以下這段 Javascript (在 </head> 標籤前):

<script type='text/javascript'>
//<![CDATA[
<!-- Script functions for Related Posts: RelatedLabels(), RemoveDuplicatedPosts(), contains(), ShowRelatedPosts()-->
var relatedPostsNum = 0;
var relatedTitles = new Array();
var relatedUrls = new Array();
var relatedDates = new Array();

function RelatedLabels(json) {
  var regex1=/</g, regex2=/>/g;
  for (var i = 0; i < json.feed.entry.length; i++) {
    var entry = json.feed.entry[i];
    relatedTitles[relatedPostsNum] = (entry.title.$t.replace(regex1, '&lt;')).replace(regex2, '&gt;');
    relatedDates[relatedPostsNum] = entry.published.$t.substr(0,10);
    for (var j = 0; j < entry.link.length; j++) {
      if (entry.link[j].rel == 'alternate') {
        relatedUrls[relatedPostsNum] = entry.link[j].href;
        relatedPostsNum++;
        break;
      }
    }
  }
}

function RemoveDuplicatedPosts(PostUrl) {
  var tmpUrls = new Array(0);
  var tmpTitles = new Array(0);
  var tmpDates = new Array(0);
  function contains(a, e) {
    for(var j = 0; j < a.length; j++)
      if (a[j]==e)
        return true;
    return false;
  }
  for(var i = 0; i < relatedUrls.length; i++) {
    if(!contains(tmpUrls, relatedUrls[i]) && PostUrl != relatedUrls[i]) {
      tmpUrls.length += 1;
      tmpUrls[tmpUrls.length - 1] = relatedUrls[i];
      tmpTitles.length += 1;
      tmpTitles[tmpTitles.length - 1] = relatedTitles[i];
      tmpDates.length += 1;
      tmpDates[tmpDates.length - 1] = relatedDates[i];
    }
  }
  relatedTitles = tmpTitles;
  relatedUrls = tmpUrls;
  relatedDates = tmpDates;
}

function ShowRelatedPosts(PostUrl) {
  RemoveDuplicatedPosts(PostUrl);
  var r = Math.floor((relatedTitles.length - 1) * Math.random());
  var i = 0;
  if (relatedTitles.length > 0) {
    document.write('Related Posts: <ul>');
    while (i < relatedTitles.length && i < 5) {
      document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a> - ' + relatedDates[r] + '</li>');
      if (r < relatedTitles.length - 1)
        r++;
      else
        r = 0;
      i++;
    }
    document.write('</ul>');
  }
}
//]]>
</script>

獨獲創見的部分就是把該篇本文的 URL 當變數傳入 Javascript Function 裡,在剔除重複文章的時候把自己一併從陣列裡刪掉,這樣就解掉上述的 Bug 啦!此外,函示裡紅字的部分,是用來控制相關文章的數量,我預設用五篇,請依個人需要修改。接下來,就是塞入收集相關文章的 Javascript,找到下面這段在文章內容後面顯示分類標籤的程式:

<b:if cond='data:post.labels'>
<data:postLabelsLabel/>
<b:loop values='data:post.labels' var='label'>
<a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='data:label.isLast != "true"'>,</b:if>
</b:loop>
</b:if>

在迴圈結束 </b:loop> 前面塞入呼叫收集相關文章的函示,像這樣:

<b:if cond='data:post.labels'>
<data:postLabelsLabel/>
<b:loop values='data:post.labels' var='label'>
<a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='data:label.isLast != "true"'>,</b:if>
    <!-- Fixed for Related Posts -->
    <b:if cond='data:blog.pageType == "item"'>
       <script expr:src='"/feeds/posts/default/-/" + data:label.name + "?alt=json-in-script&amp;callback=RelatedLabels&amp;max-results=10"' type='text/javascript'/>
</b:if>
</b:loop>
</b:if>

同樣的,紅色的部分也是用來限制數量,每個標籤抓出最近的幾篇文章來匯總(該數字至少要 >= 上面 Javascript 裡定義顯示的數量。數字加大,可以增加相關文章的亂數樣本,也就是相關文章可以顯示越多舊的相關文章)。抓完文章當然就是找地方顯示囉!只有一個限制:一定放要在文章分類標籤那段的後面(就是一定要呼叫過上面那段,這樣也才會有相關文章可以顯示啊~),所以我就直接放在後面(上面這段 </b:if> 標籤的後面就可以,位置依自己的樣版外觀調整),這部分呼叫顯示相關文章的程式碼如下:

<!-- Fixed for Related Posts -->
<b:if cond='data:blog.pageType == "item"'>
  <script type='text/javascript'>
    ShowRelatedPosts(&#39;<data:post.url/>&#39;);
  </script>
</b:if>

改完儲存再來看效果吧!

去除日期:

只要把這一行:
document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a> - ' + relatedDates[r] + '</li>');
改成:
document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a></li>');

2012年4月23日 星期一

自定义BLOGGER上下页提示

一般的blogger template在文章最下面要瀏覽較舊或較新的文章都是用底下這種型式顯示 
 
個人比較喜歡這種上一頁、下一頁的顯示方式 
 
想要修改的話也很簡單,只要按照下面步驟修改就可以了 




STEP 1.

修改之前請先備份好你的模板 

STEP 2.

管理後台 > 版面配置 > 修改html > 展開小裝置範本打勾 

STEP 3.

修改較新的文章這個部份,Ctrl+ F 搜尋 <data:newerPageTitle/> 會搜尋到以下程式碼 

<a class='blog-pager-newer-link' expr:href='data:newerPageUrl' expr:id='data:widget.instanceId + &quot;_blog-pager-newer-link&quot;' expr:title='data:newerPageTitle'><data:newerPageTitle/></a>

請把 <data:newerPageTitle/> 修改成想要顯示的文字,這裡示範修改成 上一頁 

STEP 4.

修改較舊的文章,Ctrl+ F 搜尋 <data:olderPageTitle/> 會搜尋到以下程式碼 

<a class='blog-pager-older-link' expr:href='data:olderPageUrl' expr:id='data:widget.instanceId + &quot;_blog-pager-older-link&quot;' expr:title='data:olderPageTitle'><data:olderPageTitle/></a>

把<data:olderPageTitle/>修改成想要顯示的文字,這裡示範修改成 下一頁 

STEP 5.

首頁部份同上 Ctrl+ F 搜尋 <data:homeMsg/> 這裡要注意的地方是會搜尋到2個<data:homeMsg/>,請修改上面那個 

<a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a> 
<b:else/> 
<b:if cond='data:newerPageUrl'> 
<a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a> 

STEP 6.

按下儲存就可以發現剛剛修改的地方已經改過來囉 

P.S

也可以用圖片顯示,網路上很容易可以找到一些給網站用的icon小圖,方法跟上面大同小異,只要用html語法取代紅色部分即可 

<img src='圖檔網址' />

blogger搜索页面仅显示标题

Blogger 首頁允許你設定最多顯示的文章數量,但是,其他的地方就不一定了。像是標籤、搜尋、網頁存檔等等匯總的頁面,文章一多一點進去,嘩啦一狗票的文章就通通連內文一併列出來,預設最多會出來 20 篇左右,但如果是歷史文章存檔的匯總,搞不好上限是 999,那通通都列出來還得了!因此,我們可能希望當點到標籤、列出搜尋結果或是歷史文章存檔,可以只列出時間和標題,有需要詳細內容的再點進去觀看。

這類的 Hack 很簡單也很普遍,後面的參考文章也都有提,但是我的需求有一點點不一樣,我「只」希望在標籤和搜尋頁面列出標題,但是在存檔頁面 (Archive) 裡面還是像首頁列出原文(不然,我做那麼多「繼續閱讀」的 Hack 效果只出現在首頁也浪費了),根據我之前的文章介紹 Blogger 內的四種頁面判斷句,也做了一點點修改。Hack 的第一個步驟,同樣是編輯範本的完整 HTML(要展開小裝置範本),找到下面的這一段(如果你裝過其他 Hack,可能不是長這樣,不過,關鍵是紅色那一行):

<b:loop values='data:posts' var='post'>
  <b:if cond='data:post.dateHeader'>
    <h2 class='date-header'><data:post.dateHeader/></h2>
  </b:if>
  <b:include data='post' name='post'/>
  <b:if cond='data:blog.pageType == "item"'>
    <b:if cond='data:post.allowComments'>
      <b:include data='post' name='comments'/>
    </b:if>
  </b:if>
</b:loop>

解釋一下,這是樣版用來「列出文章」用的範本,「任何」一種狀況下適用,那段 date-header 的是列出日期,而紅色那一行的意思就是「列出全文」。我們要動的手腳正是:「只在某些條件下列出原文,其他情況,列出標題就好」,這樣的修改,只要把下面這一段判斷取代掉上述紅色的那一行即可:

<b:if cond='data:blog.homepageUrl != data:blog.url'>
  <b:if cond='data:blog.pageType == "index"'>
    <!-- Show article title only -->
    <h3 class='post-title'><a expr:href='data:post.url'><data:post.title/></a></h3>
  <b:else/>
    <b:include data='post' name='post'/>
  </b:if>
<b:else/>
  <b:include data='post' name='post'/>
</b:if>

上面這一段的意思是:當現在所在的頁面「不是首頁」,而且,PageType 為 index (標籤/搜尋) 的時候,只列出文章的標題,否則,維持原樣列出完整內文。好!這樣就改好了!(很簡單吧!)如果你是想改的是「除了首頁」以外的頁面都只列出標題(也就是存檔頁面也要只列出標題),那麼可以把上面那段的第二行改成:

<b:if cond='data:blog.pageType != "item"'>

這樣就是:當現在所在頁面「不是首頁」,而且也「不是單篇文章的內文」時,就通通只列標題。

此外,其實這個 Hack 還有很多變化型,可以更動「只列出標題」頁面的樣式,像是「只列出標題卻不含日期」(那你要把上面 date-header 列出日期那段也塞入判斷句裡),或是更改 <h3 class='post-title'> 的 CSS。如果你也有用到我 Comment Toggling 的 Hack,那麼建議你關於 Comment: <b:if cond='data:post.allowComments'> 那三行最好也塞入判斷句裡去,這樣原始碼也會比較簡潔。

2012年4月22日 星期日

为Blogger做标题优化

Blogger默认显示单篇文章页面时标题栏是Blogger的名称在前,页文章名在后。

更改后则变成文章名在前,Blogger名称在后(听说这样有利于搜索引擎的排名)

实现的方法很简单(修改模板前请务必备份原模板):

在 控制台-布局-修改HTML 中 查找如下代码:
<title><data:blog.pageTitle/></title>

将之替换为:
<b:if cond='data:blog.pageType == &quot;index&quot;'>
<title><data:blog.title/></title>
<b:else/>
<title><data:blog.pageName/> - <data:blog.title/></title>
</b:if>

然后就保存模板,看看效果吧。

2012年3月28日 星期三

微软的人立方很给力啊

什么东东都能猜出来,很强大
http://renlifang.msra.cn/Q20/Index.aspx