如何为一个帖子指定多个作者,然后计算每个作者相关的帖子?

时间:2018-07-16 16:48:22

标签: arrays jekyll liquid

我正在尝试做的事情:

我正在尝试为每个作者 撰写的帖子创建列表。这是一个问题,因为每个帖子应该能够指定多个作者。

假设我们总共有3个帖子,共有3个作者。

编辑1:,如答案中所建议的,最好通过在最重要的事项列表中而不是CSV字符串中列出作者来完成。所以,

帖子:

---
title: post
authors:
  - foo
  - bar
---

而不是这样:

帖子:

---
title: post
authors: [foo, bar]
---

问题设置:

(根据编辑1 进行编辑)

帖子1:

---
title: post1
authors:
  - foo
  - bar
---

帖子2:

---
title: post2
authors:
  - foo
  - bar
---

帖子3:

---
title: post3
authors:
  - john doe
  - bar
---

退出:

bar (3) 
john doe (1)
foo (2)

然后单击作者即可显示所有帖子。

或者可以像这样显示一个数组,但是这种情况并不能解决问题,只是一种等效的样式。

我尝试过的

我对类别和标签也做了同样的操作,this algorithm的工作就像一个魅力。但是,不支持将site.categories替换为site.authors

返回:

  

液体异常:authors.html中0既不是符号也不是字符串

我想这是由于categoriestags的默认属性是数组。 我认为能够以某种方式将前端物质标签authors设置为数组会有所帮助。我想这是在_config.yml中完成的,但是我还是直接将其破坏了。

到目前为止,我想出了一种针对数组中的单个作者的方法,但是我远不能单独列出它们并进行计数。我想我会受到限制,原因是作者的默认属性不是数组,否则类似this one的实现将与authors这样的自定义前端变量一起使用,但不能。

我的意思(当我说“截至目前”时):

{% for post in site.posts %}
    <li><a href="{{ SITEURL }}/{{ author.url }}">{{ post.authors }}</a> ({{ post.authors[0] }})</li>
{% endfor %}

退出:

foobar (foo)
foobar (foo)
john doebar (john doe)

毕竟,我想我在这里错过了一些东西。我可能不是第一个尝试过此操作的人,但是我发现的唯一文档来自尝试我正在尝试但并未真正到达那里的人们。

This user for example created a way to count users,但与site.authors一起使用

它返回array size == 0- if子句

  

没有作者

这似乎很简单,但是由于某种原因却并非如此。至少对我来说。

编辑2:

基于Kieths的回答,我离到达那边已经很近了,但是在创建一个emphty数组时遇到了问题。根据Jekyll中的这个问题,这似乎是problem in general。但是,一种变通方法似乎是分配一个变量和split it with an emphty tag。 目前,我很难在数组中添加作者,因此可以评估其大小。

{% assign authors = site.posts | map: 'authors' | uniq %}
{% assign authorCount = '' | split: '' %}

  <div class="softwaretitle">
    {% for author in authors %}
      <a>{{ author }}</a>


      {% for post in site.posts %}
        {% for post_author in post.authors %}
          {% if post_author == author %}

            {% assign authorCount = authorCount | push author %}
            <a>({{ page.authorCount | size }})</a>

          {% endif %}
        {% endfor %Edit 2:}
      {% endfor %}
    {% endfor %}
  </div>

退出:

  

错误:液体错误(... / _ includes / authors.html第14行):包含错误的参数数量(给定1,预期为2)                错误:运行jekyll build --trace以获得更多信息。

第14行:

{% assign authorCount = authorCount | push author %}

修改3:

最后是最终结果(没有链接到帖子列表,但有详细信息)

<!-- Get a list of unique authors -->
  {% assign authors = site.posts | map: 'authors' | uniq | sort%}
  {% assign author_post_count = 0 %}
  {% for author in authors %}
          {% assign author_post_count = 0 %}

    <div class="">
      <li><a>{{ author }}
      {% for post in site.posts %}

        {% for post_author in post.authors %}
          {% if post_author == author %}
          {% assign author_post_count = author_post_count | | plus: 1 %}

          {% endif %}

        {% endfor %}
      {% endfor %}
      <span>&nbsp ({{ author_post_count }})</span></a></li>
    </div>
{% endfor %}

退出:

bar (3) 
john doe (1)
foo (2)

2 个答案:

答案 0 :(得分:2)

更新后的答案:

获取作者列表(无重复),包括作者贡献的帖子总数,以及帖子标题列表和帖子链接。

  {% assign authors = site.posts | map: 'authors' | uniq %}

  {% for author in authors %}
  {% assign author_post_count = 0 %}
   {% for post in site.posts %}
    {% if post.authors %}
     {% for post_author in post.authors %}
      {% if post_author == author %}
        {% assign author_post_count = author_post_count | plus: 1 %}
      {% endif %}
     {% endfor %}
    {% endif %}
  {% endfor %}
      <h2>{{ author }} - {{ author_post_count }}</h2>
      {% for post in site.posts %}
       {% if post.authors %}
        {% for post_author in post.authors %}
          {% if post_author == author %}
           {% assign author_url_query =  author | replace: ' ', '-' %}
            <a href="{{ post.url }}" title="A posts {{ author }}">
             {{ post.title }}
            </a>
          {% endif %}
        {% endfor %}
        {% endif %}
      {% endfor %}
  {% endfor %}

如果相反,您希望每个作者都有一个页面,其中包含由他们撰写的帖子列表(自动生成),则需要通过自定义插件扩展Jekyll。如果您有使用Ruby编程语言的经验,那么这很有可能。这是一个非常接近的示例:https://github.com/avillafiorita/jekyll-datapage_gen,您可以简单地删除_config数据要求,并对目录名称和永久链接进行硬编码:)

答案 1 :(得分:2)

问题:

  • 帖子上:打印作者+撰写的帖子数并链接到作者页面
  • 在作者页面上:打印作者数据+列出书面帖子

解决方案

我们已经有这样描述的帖子:

---
title: post2
authors: [foo, bar]

# or with the alternate YAML array syntax
authors:
  - foo
  - bar

---

对于作者,我们可以使用一个特定的集合,该集合将自动生成作者的页面。

_config.yml中:

collections:
  authors:
    output: true

defaults:
  - scope:
      type: authors
    values:
      layout: authors

作者页面可以这样描述:

_authors / foo.md

---
uid : foo
firstname: John
lastname: Foo
---

Some bio here ...

帖子列表(索引或任何页面):

{% assign posts = site.posts %}
{% comment %}
or {% assign posts = paginator.posts %} if you use pagination
{% endcomment %}

<ul>
{% for post in posts %}
  <li>
    <a href="{{ site.baseurl }}{{ p.url }}">{{ p.title }}</a>
    <br>{% include authors.html post=post %}
  </li>
{% endfor %}
</ul>

我们还将使用我们包含在 _layouts / post.html

中的作者
...
    <h1 class="post-title" itemprop="name headline">{{ page.title | escape }}</h1>
    <p>{% include authors.html post=page %}</p>
...

现在神奇了: _includes / authors.html

{% assign post = include.post %}

{% comment %}## if we have a least one author in post authors array {% endcomment %}
{% if post.authors and post.authors != empty %}

  {% comment %} ## We will build a string for each author,
                   store it in authorsArray
                   then reassemble it at the end {% endcomment %}
  {% assign authorsArray = "" | split: "" %}

  {% for author in post.authors %}

    {% comment %}## Count posts for current author {% endcomment %}
    {% assign authorsPostsCount = site.posts | where_exp: "post", "post.authors contains author" | size %}

    {% comment %}## Get authors data based on uid matching in the collection {% endcomment %}
    {% assign authorsDatas = site.authors | where: "uid", author | first %}

    {% if authorsDatas %}
      {% capture authorString %}
      <a href="{{ site.baseurl }}{{ authorsDatas.url }}">{{ authorsDatas.firstname }} {{ authorsDatas.lastname }} ({{ authorsPostsCount }}) </a>
      {% endcapture %}

    {% else %}
      {% comment %}## No entry for this author in the collection
                   ## or author spelling is wrong {% endcomment %}
      {% capture authorString %}
        {{ author | capitalize }} ({{ authorsPostsCount }})
      {% endcapture %}
    {% endif %}

    {% comment %}## Push result in authorsArray {% endcomment %}
    {% assign authorsArray = authorsArray | push: authorString %}
  {% endfor %}
  {% comment %}## Create a sentence with array elements {% endcomment %}
  by {{ authorsArray | array_to_sentence_string }}
{% endif %}

_layouts / author.html

---
layout: default
---

<h1>{{ page.firstname }} - {{ page. lastname }}</h1>

{% assign authorsPosts = site.posts | where_exp: "post", "post.authors contains page.uid" %}

<ul>
  {% for p in authorsPosts %}
    <li><a href="{{ site.baseurl }}{{ p.url }}">{{ p.title }}</a></li>
  {% endfor %}
</ul>