抱歉,因为我是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)
Run Code Online (Sandbox Code Playgroud)
这是我在模板中添加的内容:
{% popular_tags %}
Run Code Online (Sandbox Code Playgroud)
Chr*_*cht 18
没有插件也可以这样做,这意味着它可以在GitHub页面上运行.
我已经在我的博客上做了类似的事情(没有插件),我正在显示一个带有帖子计数的标签列表,按字母顺序排序.源代码在这里.
修改它并没有太大的努力,以便按帖子计数排序:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
我想有一些必要的解释:
tag[0]是标签的名称.
tag[1]是一个包含标签帖子的数组,tag[1].size帖子计数也是如此.
基本上,我们需要捕获类似的东西tag[1].size#tag[0],这将导致像这样的字符串:
3#TagWithThreePosts 1#TagWithOnePost 2#TagWithTwoPosts
Run Code Online (Sandbox Code Playgroud)然后,在该{% assign sortedtags = ...行中,我们再次拆分并对其进行排序,因此结果是一个排序的字符串数组:
1#TagWithOnePost2#TagWithTwoPosts3#TagWithThreePosts在最后一个循环中,我们以反向(=降序)顺序循环,分割#得到标签名称和帖子计数,并显示链接.
唯一的问题是有10个帖子和更多帖子的标签.
由于我们对字符串进行排序,因此第2步的结果如下所示:
1#TagWithOnePost10#TagWithTenPosts← 错误的订单,因为它是一个字符串!2#TagWithTwoPosts3#TagWithThreePosts为了解决这个问题,我为了排序而在帖子数上加1000.所以1#...,10#...成为1001#...和1010#...,他们被正确地命令.
我仍然想显示实际的帖子号码(没有添加1000个),所以我将它作为部分中的第三个项目添加{% capture tags %}:
{{ tag[1].size | plus: 1000 }}#{{ tag[0] }}#{{ tag[1].size }}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我正在链接到标签页面(/tags/#blah例如,单页上所有标签的所有帖子),我也以类似的方式实现,这里描述的.
事实上,从我目前阅读的内容来看,Jekyll 中的标签插件应该像标签一样使用,而不是像变量一样使用。因此,在这种情况下,您确实应该在模板中使用它:
{% popular_tags %}
Run Code Online (Sandbox Code Playgroud)
但你们班级的行为似乎是错误的。它不应该返回变量/散列,它应该返回将显示的 HTML 代码而不是popular_tagstag。
例如,您可以执行以下操作:
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)
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。我刚刚尝试过,它按预期工作。如果您想首先显示最常用的标签,只需更改行sort_by,并使用-posts.count代替posts.count。
你可以看看这个其他插件的源代码,可能对你有帮助。