Blogger相关文章模块升级版

之前显示BLogger相关文章的Hack模块,是根据文章的标题来判断文章的相关性。PurpleMoggy的这个Hack是根据标签来判断文章相关性的,应该更合适一些。(标签中不能包含像?/之类的字符)

1.把下面代码放在<head></head>中。选中“扩展窗口小部件模板 ”

<script type="text/javascript">
//<![CDATA[
var relatedTitles = new Array();
var relatedTitlesNum = 0;
var relatedUrls = new Array();
function related_results_labels(json) {
for (var i = 0; i < json.feed.entry.length; i++) {
var entry = json.feed.entry[i];
relatedTitles[relatedTitlesNum] = entry.title.$t;
for (var k = 0; k < entry.link.length; k++) {
if (entry.link[k].rel == 'alternate') {
relatedUrls[relatedTitlesNum] = entry.link[k].href;
relatedTitlesNum++;
break;
}
}
}
}
function removeRelatedDuplicates() {
var tmp = new Array(0);
var tmp2 = new Array(0);
for(var i = 0; i < relatedUrls.length; i++) {
if(!contains(tmp, relatedUrls[i])) {
tmp.length += 1;
tmp[tmp.length - 1] = relatedUrls[i];
tmp2.length += 1;
tmp2[tmp2.length - 1] = relatedTitles[i];
}
}
relatedTitles = tmp2;
relatedUrls = tmp;
}
function contains(a, e) {
for(var j = 0; j < a.length; j++) if (a[j]==e) return true;
return false;
}
function printRelatedLabels() {
var r = Math.floor((relatedTitles.length - 1) * Math.random());
var i = 0;
document.write('<ul>');
while (i < relatedTitles.length && i < 20) {
document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a></li>');
if (r < relatedTitles.length - 1) {
r++;
} else {
r = 0;
}
i++;
}
document.write('</ul>');
}
//]]>
</script>

2.在代码中找到下面的部分。

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

3.更改为下面形式。其中的粗体为添加的部分。

<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:if cond='data:blog.pageType == "item"'>
<script expr:src='"/feeds/posts/default/-/" + data:label.name + "?alt=json-in-script&amp;callback=related_results_labels&amp;max-results=10"' type='text/javascript'/>
</b:if>

</b:loop>
</b:if>

4.保存模板,并转到“页面元素”中,添加一个HTML/Javascript模块,在里面填上下面代码,并保存。

<script type="text/javascript">
removeRelatedDuplicates();
printRelatedLabels();
</script>

5.再回到Html编辑,选中“扩展窗口小部件模板 ”。找到下面的部分,其中粗体部分为要添加的部分。

<b:widget id='HTML13' locked='false' title='Related Posts' type='HTML'>
<b:includable id='main'>
<b:if cond='data:blog.pageType == "item"'>
<!-- only display title if it's non-empty -->
<b:if cond='data:title != ""'>
<h2 class='title'><data:title/></h2>
</b:if>
<div class='widget-content'>
<data:content/>
</div>
<b:include name='quickedit'/>
</b:if>
</b:includable>
</b:widget>

自定义部分:通过蓝色标记(即i < 20max-results=10)出的部分我们可以自定义显示相关文章的数目。页面加载速度和相关文章的数目之间的平衡自己掌握好了。

14 条评论:

匿名 说...

有例子看看 吗 ?

咖啡鱼 说...

我现在用的就是啦,效果非常不错哦

Ryan Hooper 说...

超好用!效果不错,比上次那个hack好多了,而且速度也比那个快,不会出现乱码

GG 说...

不过标签栏的相关文章其实不就是标签RSS的翻版吗?

感觉像我博客把标签RSS放在页首了,就没有必要用这种相关文章了……

匿名 说...

实在不好意思,我这里怎么找不到第2步中的代码啊?

monkey 说...

我照着做了,可是显示是空白啊,是怎么回事啊。zwblogger.blogspot.com

董春鹏 说...

咖啡鱼,你好。

我试了你帖子里的方法,不行啊。第二步找不到你说的代码。我估计是模板不同的原因。

你能不能写一下在Rounders 3模板下,怎么实现相关文章。

与你交换连接可以吗?

我的blog

http://tiaozaoshichang.blogspot.com/

PigTail Leo 说...

这个方法我试过,成功,但是不喜欢,因为他把相关文章是放在 widget 页面元素里面,我想放在各个文章的最后面。

底下这两个作者都有不错的解决方案:

Abin's Tech Note
http://abintech.azhai.org/2007/03/related-post.html


哟哪桑 Speaking
http://jonathan-speaking.blogspot.com/2007/03/show-related-post-in-blogger.html

贝尼晨恩 说...

谢谢

匿名 说...

怎么说呢,总没能成功。

匿名 说...

不错R

匿名 说...

好麻烦啊

小毅 说...

谢谢分享,已经实现。

Unknown 说...

非常感谢。

如这个办法,确实比较管用。简单。