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

Only one page generated to sitemap with gatsby-plugin-sitemap

我无法为我的 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 && 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,
          }
        },
      },
    },

我认为您的问题是因为您没有设置 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,
      }
    },

在 Ferran Buireu 的精神和技术支持下,我设法进行了更深入的挖掘。

在 public 文件夹中找到站点地图 sitemap/sitemap-0.xmlthesite.nl/sitemap/sitemap-0.xml

的所有页面提供正确的路径

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

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