Jekyll Page 数据不会持久化

Jekyll Page data does not persist

Jekyll 版本 2.5.3

我们正在尝试编写一个插件来推广不可知的内容,无论是页面还是 post。但是,页面和 posts 之间存在一些不明确的差异。

  # this does not work
  site.pages.each do |page|
    # this does not show up in liquid
    page.data['baz'] = 'Foo'
  end

  # this does work
  site.posts.each do |post|
    # this does show up in liquid
    post.data['baz'] = 'Bar'
  end

关于为什么改变 post 的 .data 散列在 liquid 中是可访问的,但改变页面的 .data 散列没有效果的任何想法?

我们还用 .data["title"] 测试了它,它对 posts 有影响,但 page 标题不受影响。


{% for post in site.posts %}
   <div class="postbaz">{{ post.baz }}</div>
{% endfor %}

{% for page in site.pages %}
   <div class="pagebaz">{{ page.baz }}</div>
{% endfor %}

产量

<div class="postbaz">Foo</div>
<div class="postbaz">Foo</div>
<div class="postbaz">Foo</div>
<div class="pagebaz"></div>
<div class="pagebaz"></div>

你错过了一些东西。向 data 添加值对于页面和 posts 都非常有效。

参考my repository

Here 我将 'foo' 属性添加到所有页面和 posts

_plugins/foo.rb

module Foo
  class Generator < Jekyll::Generator
    def generate(site)
      puts "Our plugin is running"
      puts site.pages.inspect
      puts site.posts.inspect
      site.pages.each do |page|
        page.data['foo'] = 'bar'
      end
      site.posts.each do |post|
        post.data['foo'] = 'bar'
      end
    end
  end
end

这里我将'foo'添加到post的布局中:

post.html

<article class="post-content">
  {{ content }}
  {{ page.foo }}
</article>

然后 pages layout:

page.html

<article class="post-content">
  {{ content }}
  {{ page.foo }}
</article>

在我 运行 jekyll b 之后,我可以在两个 post and page 中看到输出,就在我期望的位置。

在单独的 b运行ch 中,我重新创建了您的设置,您在其中遍历所有页面和 posts:

default.html (source)

{% for post in site.posts %}
   <div class="postbaz">{{ post.foo }}</div>
{% endfor %}

{% for page in site.pages %}
   <div class="pagebaz">{{ page.foo }}</div>
{% endfor %}

_plugins/foo.rb (source)

site.pages.each do |page|
  page.data['foo'] = 'bar'
end
site.posts.each do |post|
  post.data['foo'] = 'baz'
end

(注意 属性 对于页面是 'bar',对于 post 是 'baz'。)

它按预期呈现:

site/index.html (source)

<div class="postbaz">baz</div>



<div class="pagebaz">bar</div>

<div class="pagebaz">bar</div>

<div class="pagebaz">bar</div>

<div class="pagebaz">bar</div>