使用 gatsby-plugin-sitemap 仅生成一页到站点地图

     2023-03-08     200

关键词:

【中文标题】使用 gatsby-plugin-sitemap 仅生成一页到站点地图【英文标题】:Only one page generated to sitemap with gatsby-plugin-sitemap 【发布时间】:2021-10-29 14:44:51 【问题描述】:

我无法为我的 Gatsy 网站创建站点地图。

插件的默认设置即使有多页也只创建一页:

<sitemap>
<loc>https://www.thesite.nl/sitemap/sitemap-0.xml</loc>
</sitemap>

如果我尝试使用以下命令覆盖默认设置:

query: `
          site 
            siteMetadata 
              siteUrl
            
          
          allSitePage 
            nodes 
              path
            
          
        `,
        serialize: ( site, allSitePage ) =>
          allSitePage.nodes
            .filter(node => 
              const path = node.path
              console.log( path )
              // Filter out 404 pages
              if (path.includes("404")) 
                return false
              
              // Filter out base pages that don't have a language directory
              return supportedLanguages.includes(path.split("/")[1])
            )
            .map(node => 
              return 
                url: `$site.siteMetadata.siteUrl$node.path`,
                changefreq: `weekly`,
                priority: 0.7,
              
            ),

我得到TypeError: Cannot read property 'nodes' of undefined 问题是,使用 gatsby develop 我可以像这样查询节点并获取路径,即使它在这里显示未定义。

我有 Gatsby v3,我认为可能会影响的唯一插件可能是 "gatsby-plugin-intl": "^0.3.3",


      resolve: `gatsby-plugin-intl`,
      options: 
        // language JSON resource path
        path: `$__dirname/src/intl`,
        // supported language
        languages: [`nl`, `en`],
        language: `nl`,
        // language file path
        defaultLanguage: `nl`,
        // option to redirect to `/nl` when connecting `/`
        redirect: false,
      ,
    ,

有什么想法吗?

在@FerranBuireu 建议更改查询后,通过自定义选项使用gatsby build &amp;&amp; gatsby serve 构建它,现在看起来像这样,但站点地图仍然是空的:

const siteUrl = process.env.URL || `https://www.thesite.nl`
 
      resolve: "gatsby-plugin-sitemap",
      options: 
        query: `
        
          allSitePage 
            nodes 
              path
            
          
        
      `,
        resolveSiteUrl: () => siteUrl,
        resolvePages: ( allSitePage:  nodes: allPages  ) => 
          return allPages.map(page => 
            return  ...page 
          )
        ,
        serialize: ( path ) => 
          return 
            url: path,
          
        ,
      ,
    ,

【问题讨论】:

该查询在localhost:8000/___graphql 操场上有效吗? @FerranBuireu 是的,它有效。 现在还将国际插件插件设置添加到问题@FerranBuireu 与 gatsby-plugin-advanced-sitemap 相同的问题,生成一个/不生成页面。 【参考方案1】:

我认为您的问题是因为您没有设置resolveSiteUrl,在这种情况下,siteUrl 需要存在。根据docs:

siteMetadata: 
  // If you didn't use the resolveSiteUrl option this needs to be set
  siteUrl: `https://www.example.com`,
,

理想的完整配置应该是:

const siteUrl = process.env.URL || `https://fallback.net`

// In your gatsby-config.js
module.exports = 
  plugins: [
    
      resolve: "gatsby-plugin-sitemap",
      options: 
        query: `
        
          allSitePage 
            nodes 
              path
            
          
          allWpContentNode(filter: nodeType: in: ["Post", "Page"]) 
            nodes 
              ... on WpPost 
                uri
                modifiedGmt
              
              ... on WpPage 
                uri
                modifiedGmt
              
            
          
        
      `,
        resolveSiteUrl: () => siteUrl,
        resolvePages: (
          allSitePage:  nodes: allPages ,
          allWpContentNode:  nodes: allWpNodes ,
        ) => 
          const wpNodeMap = allWpNodes.reduce((acc, node) => 
            const  uri  = node
            acc[uri] = node

            return acc
          , )

          return allPages.map(page => 
            return  ...page, ...wpNodeMap[page.path] 
          )
        ,
        serialize: ( path, modifiedGmt ) => 
          return 
            url: path,
            lastmod: modifiedGmt,
          
        ,
      ,
    ,
  ],

调整并调整它以适合您的查询。

我会这样做:

    resolveSiteUrl: () => siteUrl,
    resolvePages: (
      allSitePage:  nodes: allPages ,
    ) => 
      const sitePageNodeMap = allSitePage.reduce((acc, node) => 
        const  uri  = node
        acc[uri] = node

        return acc
      , )

      return allPages.map(page => 
        return  ...page, ...sitePageNodeMap[page.path] 
      )
    ,
    serialize: ( path, modifiedGmt ) => 
      return 
        url: path,
        lastmod: modifiedGmt,
      
    ,

【讨论】:

试图调整但没有成功。添加到您的建议@Ferrain Buireu 现在看起来如何的问题。也许更近一步? 默认设置也是如此,没有插件选项,仍然没有页面。 reduce 方法适合您吗?我已经更新了答案。 谢谢,是的,map 和 reduce 似乎都有效。 reduce 有一个语法,应该是 allPages.reduce :) 虽然这个谜似乎已经解决了。我是个白痴。站点地图位于 /sitemap/sitemap-0.xml 而不是 /sitemap/sitemap-index.xml【参考方案2】:

在 Ferran Buireu 的精神和技术支持后,我设法深入挖掘。

在公共文件夹中,站点地图位于 sitemap/sitemap-0.xmlthesite.nl/sitemap/sitemap-0.xml 处提供所有页面的正确路径

另外值得注意的是,&lt;sitemapindex&gt; 是指向站点地图-0 的有效元素:https://www.sitemaps.org/protocol.html。如果在那里提交,Google 搜索控制台仍然需要 /sitemap/sitemap-0.xml。

所以看起来页面的输出大部分时间都在那里。 #白痴

【讨论】:

使用“使用严格”作为“使用强”的备份

】使用“使用严格”作为“使用强”的备份【英文标题】:Using"usingstrict"asabackupfor"usestrong"【发布时间】:2016-06-1604:26:29【问题描述】:有没有办法使用"usestrong";并使用"usestrict";作为备份?因为Google... 查看详情

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

】在使用加载数据流步骤的猪中,使用(使用PigStorage)和不使用它有啥区别?【英文标题】:InpigwhileusingLoaddataflowstepwhatisdifferencewithusing(UsingPigStorage)andwithoutusingit?在使用加载数据流步骤的猪中,使用(使用PigStorage)和不使用它... 查看详情

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

】MySQLdb在按日期排序时使用“使用位置;使用临时;使用文件排序”【英文标题】:MySQLdbisusing"Usingwhere;Usingtemporary;Usingfilesort"whensortingbydate【发布时间】:2011-07-2207:56:47【问题描述】:我有一个包含一堆记录的数据库,... 查看详情

如何使用 AutoMapper 使用 EntityFramework 使用嵌套列表更新对象?

】如何使用AutoMapper使用EntityFramework使用嵌套列表更新对象?【英文标题】:HowtouseAutoMapperforupdatingObjectwithnestedListusingEntityFramework?【发布时间】:2022-01-0315:40:44【问题描述】:我想使用AutoMapper将带有嵌套列表的EntityDto映射到实体... 查看详情

qt静态编译时使用openssl有三种方式(不使用,动态使用,静态使用,默认是动态使用)

WhencompilingQtyoucanchooseoneoftheseoptionsbasedontheconfigurecommandline:noOpenSSLsupport(-no-openssl)QtNetworkdynamicallyopeningOpenSSLlibs(-openssl;default)QtNetworklinkingtoOpenSSL(-openssl-linke 查看详情

何时使用自旋锁?何时使用互斥体?

中断上下文只能使用自旋锁。任务睡眠时只能使用互斥体。需求建议的加锁方法低开销加锁优先使用自旋锁短期锁定优先使用自旋锁长期加锁优先使用互斥体中断上下文加锁使用自旋锁持有锁需要睡眠使用互斥体  查看详情

kettlejava脚本组件的使用说明(简单使用升级使用)

文章目录前言Kettlejava脚本组件的使用说明(简单使用、升级使用)01简单使用02升级使用前言  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^_^。  而且听说点赞的人每天的运气... 查看详情

使用pidstat监控资源使用

 linux可以使用pidstat命令监控系统资源,比如监控cup使用如下:pidstat-u1还可以使用-r(内存)-d(硬盘) 查看详情

如何使用公钥加密字符串并使用 MimeKit 使用私钥解密?

】如何使用公钥加密字符串并使用MimeKit使用私钥解密?【英文标题】:HowtoencryptstringwithpublickeyanddecryptusingprivatekeyusingMimeKit?【发布时间】:2021-04-0118:27:35【问题描述】:我很难寻找有关如何使用公钥证书加密字符串并使用Mimekit... 查看详情

如何使用 webpack 使用它

】如何使用webpack使用它【英文标题】:Howtoconsumethiswithwebpack【发布时间】:2015-10-1405:17:20【问题描述】:如何在webpackreact应用程序中使用这个repo:https://github.com/chris-rudmin/Recorderjs我已经创建了一个新的库并以es6模块样式导出主... 查看详情

使用 C++ 和 Boost(或不使用?)检查是不是正在使用特定端口?

】使用C++和Boost(或不使用?)检查是不是正在使用特定端口?【英文标题】:UsingC++andBoost(ornot?)tocheckifaspecificportisbeingused?使用C++和Boost(或不使用?)检查是否正在使用特定端口?【发布时间】:2016-01-2607:04:05【问题描述】:... 查看详情

Mysql查询使用索引使用文件排序使用临时

】Mysql查询使用索引使用文件排序使用临时【英文标题】:Mysqlqueryusingindexusingfilesortusingtemporary【发布时间】:2014-08-2713:58:18【问题描述】:我的数据库中有以下两个表:表1:图片列:jeid[和其他]主键:jeid行数:160万表2:媒体... 查看详情

如何使用 React 使用 Notion API

】如何使用React使用NotionAPI【英文标题】:HowtoconsumeNotionAPIwithReact【发布时间】:2021-08-0601:54:19【问题描述】:我正在尝试使用新的NotionAPI作为我个人网站的CMS。作为一种改进方法,我尝试将它与React一起使用。但它似乎不允许CO... 查看详情

如何使用@JmsListener 暂停并开始使用消息

】如何使用@JmsListener暂停并开始使用消息【英文标题】:Howtopauseandstartconsumingmessageusing@JmsListener【发布时间】:2016-07-0223:47:57【问题描述】:我使用的是SpringBoot1.3.2版。我正在使用@JmsListener为我使用JmsTemplate创建/生成的消息使用... 查看详情

为啥使用最近最少使用的简单缓存机制?

】为啥使用最近最少使用的简单缓存机制?【英文标题】:WhyistheSimpleLeastRecentlyUsedCacheMechanismused?为什么使用最近最少使用的简单缓存机制?【发布时间】:2018-03-0208:27:47【问题描述】:我使用JProfiler检查Java微服务,同时使用JMe... 查看详情

使用 Makecert 设置密钥使用属性

】使用Makecert设置密钥使用属性【英文标题】:SettingKeyUsageattributeswithMakecert【发布时间】:2011-02-2615:45:58【问题描述】:是否可以使用makecert或任何其他我可以用来生成我自己的测试证书的工具来设置密钥使用属性?我感兴趣的... 查看详情

使用 multiDexEnabled 而不使用 Gradle,而是使用 Eclipse 构建过程

】使用multiDexEnabled而不使用Gradle,而是使用Eclipse构建过程【英文标题】:UsemultiDexEnabledwithoutGradlebutEclipsebuildprocessinstead【发布时间】:2015-01-0109:14:22【问题描述】:由于最新的SDK版本,创建具有多个dex文件(https://developer.android.co... 查看详情

使用 jQuery 使用 WCF 服务

】使用jQuery使用WCF服务【英文标题】:ConsumingWCFserviceusingjQuery【发布时间】:2011-08-1023:55:33【问题描述】:到目前为止,我已经使用了Web服务,并且运行良好。我添加了一个新的WCF服务。我正在使用jQuery调用服务。这就是我使用... 查看详情