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

如何解决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>

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?