使用 gatsby-plugin-sitemap 仅生成一页到站点地图
Posted
技术标签:
【中文标题】使用 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 && 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.xml
在thesite.nl/sitemap/sitemap-0.xml
处提供所有页面的正确路径
另外值得注意的是,<sitemapindex>
是指向站点地图-0 的有效元素:https://www.sitemaps.org/protocol.html。如果在那里提交,Google 搜索控制台仍然需要 /sitemap/sitemap-0.xml。
所以看起来页面的输出大部分时间都在那里。 #白痴
【讨论】:
以上是关于使用 gatsby-plugin-sitemap 仅生成一页到站点地图的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?