eleventy:在站点地图的永久链接中生成每个类别

问题描述

我使用Skeleventy生成我的静态网站。

Njk模板在那里使用collections.all为所有可能的页面生成站点地图,就像这样

---
permalink: sitemap.xml
hidden: true
---
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{%- for page in collections.all %}
{%- if not page.data.hidden %}
    <url>
        <loc>{{ site.url }}{{ page.url | url }}</loc>
        <lastmod>{{ page.date | htmlDatedisplay }}</lastmod>
    </url>
{%- endif %}
{%- endfor %}

resulting sitemap中的输出之一是

https://skeleventy.netlify.app/category/all/

这是所有可能页面的集合-有点混乱。

例如,最好是Google为每个类别编制索引,而不是“全部归类”

<url>
<loc>https://skeleventy.netlify.app/category/software/</loc>
<lastmod>2020-7-20</lastmod>
</url>
<url>
<loc>https://skeleventy.netlify.app/category/writing/</loc>
<lastmod>2020-7-20</lastmod>
</url>

但是我如何编辑该njk模板,以便它 捕获并在站点地图中输出不同类别? -不包括类别/全部 -留下其他重要页面,例如首页,每个博客帖子等。

解决方法

我想我有工作。我已经在我的机器上运行了该程序,如果您想要一个副本,请与我们联系。我通常不使用Nunjucks,因此请原谅任何愚蠢的错误。我对sitemap.njk进行的第一个修改是隐藏collections.all:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{%- for page in collections.all %}
{%- if not page.data.hidden %}
    {%- if page.url !== "/category/all/" %}
    <url>
        <loc>{{ site.url }}{{ page.url | url }}</loc>
        <lastmod>{{ page.date | htmlDateDisplay }}</lastmod>
    </url>
    {% endif %}
{%- endif %}
{%- endfor %}

Kinda hacky但工作了。接下来,我需要一种获取博客类别页面的方法。我看着tag.njk。根据我在那里看到的内容,我为.eleventy.js编写了一个名为category的过滤器。我认为这不是一个好名字:

eleventyConfig.addFilter("categories",function(collections) {
      let categories = Object.keys(collections).filter(c => c !== 'all');
      return categories;
});

回到站点地图,然后执行此操作:

{%- set cats = collections | categories %}
{%- for cat in cats %}
    {% set newestDate = collections[cat] | getLatestDate %}
    <url>
        <loc>{{ site.url }}/category/{{ cat }}/</loc>
        <lastmod>{{ newestDate | htmlDateDisplay }}</lastmod>
    </url>
{%- endfor %}
</urlset>

请注意getLatestDate过滤器,其定义如下:

eleventyConfig.addFilter("getLatestDate",function(collection) {
    console.log('running getLatestDate');
    return collection[0].date;
});

它似乎运作良好。这是我的输出:

<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>https://skeleventy.netlify.app/blog/post-1/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    <url>
        <loc>https://skeleventy.netlify.app/blog/post-2/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    <url>
        <loc>https://skeleventy.netlify.app/blog/post-3/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    <url>
        <loc>https://skeleventy.netlify.app/about/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    <url>
        <loc>https://skeleventy.netlify.app/blog/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    <url>
        <loc>https://skeleventy.netlify.app/contact/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    <url>
        <loc>https://skeleventy.netlify.app/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    
    <url>
        <loc>https://skeleventy.netlify.app/category/blog/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    <url>
        <loc>https://skeleventy.netlify.app/category/business/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    <url>
        <loc>https://skeleventy.netlify.app/category/digital/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
    
    <url>
        <loc>https://skeleventy.netlify.app/category/health/</loc>
        <lastmod>2020-8-26</lastmod>
    </url>
</urlset>

如果您想要完整的副本,请与我联系。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...