使用 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.xml
为 thesite.nl/sitemap/sitemap-0.xml
的所有页面提供正确的路径
另外值得注意的是,<sitemapindex>
是指向 sitemap-0 的有效元素:https://www.sitemaps.org/protocol.html。 Google 搜索控制台仍然需要 /sitemap/sitemap-0。xml 如果在那里提交。
所以看起来大部分时间页面的输出都在那里。 #白痴
我无法为我的 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.xml
为 thesite.nl/sitemap/sitemap-0.xml
另外值得注意的是,<sitemapindex>
是指向 sitemap-0 的有效元素:https://www.sitemaps.org/protocol.html。 Google 搜索控制台仍然需要 /sitemap/sitemap-0。xml 如果在那里提交。
所以看起来大部分时间页面的输出都在那里。 #白痴