道歉,因为我是Ruby的新手,但我试图在我的模板中添加一个液体标签,我可以循环显示五个最受欢迎的标签列表。
出于某种原因,这个插件在我使用它时只输出一个标签。
这是我在mu插件中添加的内容:
module Jekyll
class PopularTags < Liquid::Tag
def initialize(tag_name, text, tokens)
super
end
def render(context)
tags = context.registers[:site].tags
return tags.sort_by { |tag, posts| posts.count }
end
end
end
Liquid::Template.register_tag('popular_tags', Jekyll::PopularTags)
以下是我在模板中添加的内容:
{% popular_tags %}
答案 0 :(得分:17)
也可以在没有插件的情况下执行此操作,这意味着它可以在GitHub Pages上使用。
我已经在my blog上做了类似的(没有插件),我正在显示一个带有帖子计数的标签列表,按字母顺序排序。 The source code is here
修改它并没有太大的努力,以便按帖子计数排序:
{% capture tags %}
{% for tag in site.tags %}
{{ tag[1].size | plus: 1000 }}#{{ tag[0] }}#{{ tag[1].size }}
{% endfor %}
{% endcapture %}
{% assign sortedtags = tags | split:' ' | sort %}
{% for tag in sortedtags reversed %}
{% assign tagitems = tag | split: '#' %}
<li><a href="/tags/#{{ tagitems[1] }}">{{ tagitems[1] }} ({{ tagitems[2] }})</a></li>
{% endfor %}
我想有一些必要的解释:
tag[0]
是代码的名称
tag[1]
是一个包含标记帖子的数组,因此tag[1].size
是帖子计数。
基本上,我们需要捕获类似tag[1].size#tag[0]
的内容,这会产生如下字符串:
3#TagWithThreePosts 1#TagWithOnePost 2#TagWithTwoPosts
然后,在{% assign sortedtags = ...
行中,我们再次拆分它并对其进行排序,因此结果是一个排序的字符串数组:
1#TagWithOnePost
2#TagWithTwoPosts
3#TagWithThreePosts
在最后一个循环中,我们以反向(=降序)顺序循环,按#
分割以获取标签名称和帖子计数,并显示链接。
唯一的问题是有10个以上帖子的标签 由于我们对字符串进行排序,因此第2步的结果如下所示:
1#TagWithOnePost
10#TagWithTenPosts
←错误订单,因为它是一个字符串! 2#TagWithTwoPosts
3#TagWithThreePosts
为了解决这个问题,我为了排序而在帖子数上加1000。因此1#...
和10#...
成为1001#...
和1010#...
,并且订单正确。
我仍然想显示实际的帖子编号(没有添加1000个),所以我将其作为{% capture tags %}
部分中的第三项添加:
{{ tag[1].size | plus: 1000 }}#{{ tag[0] }}#{{ tag[1].size }}
顺便说一句,我正在链接到一个标记页面(/tags/#blah
,例如单页上所有标记的所有帖子),我也以类似的方式实现了described here。< / p>
答案 1 :(得分:3)
实际上,从我目前正在阅读的内容来看,Jekyll中的Tag插件应该像标签一样使用,而不是像变量一样。那么在这种情况下,您确实应该在模板中使用它:
{% popular_tags %}
但是你的班级行为似乎是错误的。它不应该返回变量/ hash,它应该返回将显示的HTML代码而不是popular_tags
标记。
例如,这是你可以做的事情:
module Jekyll
class PopularTags < Liquid::Tag
def initialize(tag_name, text, tokens)
super
end
def render(context)
tags = context.registers[:site].tags
html = "<ul>"
sorted = tags.sort_by { |t,posts| posts.count }
sorted.each do |t, posts|
html << "<li>TAG: #{t} (#{posts.count})</li>"
end
html << "</ul>"
html
end
end
end
Liquid::Template.register_tag('popular_tags', Jekyll::PopularTags)
希望这会有所帮助。我只是尝试了它,它按预期工作。如果您想首先显示最常用的代码,只需更改sort_by
行,然后使用-posts.count
代替posts.count
。
您可以查看this other plugin source code,可能对您有帮助。