问题描述
我使用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>
如果您想要完整的副本,请与我联系。