你如何通过Jekyll的帖子计数对site.tags进行排序?

Jus*_*tin 8 ruby jekyll

抱歉,因为我是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帖子计数也是如此.

  1. 基本上,我们需要捕获类似的东西tag[1].size#tag[0],这将导致像这样的字符串:

    3#TagWithThreePosts 1#TagWithOnePost 2#TagWithTwoPosts
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后,在该{% assign sortedtags = ...行中,我们再次拆分并对其进行排序,因此结果是一个排序的字符串数组:

    • 1#TagWithOnePost
    • 2#TagWithTwoPosts
    • 3#TagWithThreePosts
  3. 在最后一个循环中,我们以反向(=降序)顺序循环,分割#得到标签名称和帖子计数,并显示链接.

唯一的问题是有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 }}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我正在链接到标签页面(/tags/#blah例如,单页上所有标签的所有帖子),我也以类似的方式实现,这里描述的.

  • 这确实很好,但它不适用于 @mpchadwick 添加的带有空格的标签,并且它不会以这种方式按字母顺序对标签进行排序。由于颠倒了之间的列表,它确实颠倒了字母顺序。我修复了这两个问题并将解决方案发布在我的博客上:http://www.gungorbudak.com/blog/2017/12/08/tags-cloud-sorted-by-post-count-for-jekyll-blogs-没有插件/。这不是一个被接受的答案,但它确实很好,所以我仍在分享。谢谢! (2认同)

Pie*_*son 4

事实上,从我目前阅读的内容来看,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

你可以看看这个其他插件的源代码,可能对你有帮助。