我的帝国,我做主! 我的帝国,我自由! 我的帝国,……

    在Blogger中加入相关文章(BUG已修正)

    | 2009-03-17
      先前的文章中存在3个Bug无法修正,经过了2天的思考,我修正了其中的2个,还有一个现实空白字段的问题由于需要在javascript代码段中写入判断语句进行排除,但我本人没有学过javascript脚本语言,无法做到,十分抱歉,但只需要限制抓起池的大小(也就是后面注明的那个红色的10)就可以极大程度的回避此问题,经过测试,但该值小于相关标签总文章数70%后,整个代码的出错几率已经可以接受了,如果小于50%,则出错几率已经非常小了,可以考虑不计。

      我一直没有考虑到这个功能,一直是在想如何能够建立一个便于查询的速查表,但显然,在博客中要做一个速查表可不是一个容易的事,网上基本上都是用标签云的方式来实现,但标签云实际是一个简单的时间顺序列表,当文章数据到一定程度后,标签云基本没用,只能通过查询方式来查找,不过,加入相关文章的方式给了一个新的思路,虽然随机性非常大,但我个人觉得还是可以起一点作用,希望这个新加的功能可以给各位朋友有带来少许的便利。

      不多说了,立刻进入正题。首先保存模板,然后在模板中加入找到</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>


      这里只有一个需要注意的就是红色的代码部分,5代表显示的标题数量,自己可以修改,不过我觉得5条标题已经够多了,其他的就不多说了,照贴就行了。

      接下来就需要修改代码了,请先找到以下的代码:


    <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>


      同样是红色的部分,10代表了随机抓取的标题池,给前面的5做一个选择,如果你现在的是10,那么就是在随机抓起的10条中选5条,也就是2选1,这里的标题池越大,则可能抓起的老文章也多,我是选择了50,因为我的文章更新较快,你自己看着办吧。

      接下来还有一段代码需要加入,找到后面的<b:includable id='comments' var='post'>在后面,代码如下:


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


      好了,接下来的最后一件事就是保持。大功告成!

    5 评论:

    大仙 说...

    加入相关文章的代码了,就是不显示,这是怎么回事?求解wnshen2003@yahoo.com.cn

    Unknown 说...

    把你的模板和博客地址给我

    大仙 说...

    太感谢你,无论如何,总算出来了
    偶对代码可是一点不懂哦

    huary 说...

    为什么我的相关文章和标签之间的距离隔的有点远啊?
    抱歉,刚刚发错贴了

    Unknown 说...

    查看你的模板,这需要调节模板中主体的间隔

    发表评论

    您可以使用某些 HTML 标记,例如 <b>, <i>, <a>