No puedo crear un mapa del sitio para mi sitio de Gatsy.
La configuración predeterminada del complemento crea solo una página, incluso si hay varias páginas:
<sitemap> <loc>https://www.thesite.nl/sitemap/sitemap-0.xml</loc> </sitemap>Si trato de anular la configuración predeterminada con:
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, } }), Obtengo TypeError: Cannot read property 'nodes' of undefined El problema es que con el desarrollo de gatsby puedo consultar los nodos como este y obtener las rutas incluso si dice indefinido aquí.
Tengo Gatsby v3 y el único complemento que creo que podría afectar podría ser "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, }, },¿Algunas ideas?
Lo compré a través de opciones personalizadas con gatsby build && gatsby serve después de la sugerencia de @FerranBuireu de cambiar la consulta y ahora se ve así, pero el mapa del sitio aún está vacío:
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, } }, }, },Creo que su problema se debe a que no está configurando resolveSiteUrl y, en este escenario, siteUrl debe estar presente. Según los documentos :
siteMetadata: { // If you didn't use the resolveSiteUrl option this needs to be set siteUrl: `https://www.example.com`, },
Una configuración completa ideal debería ser:
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, } }, }, }, ], }Ajústelo y adáptelo para que se ajuste a su consulta.
Yo haría algo como:
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, } },Después del apoyo mental y técnico de Ferran Buireu logré profundizar más.
En la carpeta pública, el mapa del sitio se encontró en sitemap/sitemap-0.xml lo que da la ruta correcta a todas las páginas en thesite.nl/sitemap/sitemap-0.xml
También cabe destacar que <sitemapindex> es un elemento válido que apunta al sitemap-0: https://www.sitemaps.org/protocol.html . La consola de búsqueda de Google todavía quiere el /sitemap/sitemap-0.xml si se envía allí.
Así que parece que la salida de las páginas estuvo allí la mayor parte del tiempo. #estúpido