gatsby starter blogのマークダウンを元にしていたらgatsby-plugin-feedを書き換えずにそのまま使えるけれど、markdownじゃなくてjsonで記事を出力に変更していたから使い方を覚える必要があった。
サンプルコードには記事個別のタイトルの指定の仕方が乗っていなかったのでどうやるのかがコードを良く読むまで気づかなかった。 Object.assignはオブジェクトの要素をまとめる意味があり、node.frontmatterのなかにtitleが含まれている。それをgraphqlで取得。
markdownformatterの書き方
--- title: date: --- 本文
意味としては{title:node.frontmatter.title}を略してあるわけだ。
{ resolve: `gatsby-plugin-feed`, options: { feeds: [ { serialize: ({ query: { site, allMarkdownRemark } }) => { return allMarkdownRemark.nodes.map(node => { return Object.assign({}, node.frontmatter, { description: node.excerpt, date: node.frontmatter.date, url: site.siteMetadata.siteUrl + node.fields.slug, guid: site.siteMetadata.siteUrl + node.fields.slug, custom_elements: [{ "content:encoded": node.html }], }) }) }, query: ` { allMarkdownRemark( sort: { order: DESC, fields: [frontmatter___date] }, ) { nodes { excerpt html fields { slug } frontmatter { title date } } } } `, output: "/rss.xml", title: "Your Site's RSS Feed", }, ],
実際のコードはこうなった。
{ resolve: `gatsby-plugin-feed`, options: { query: ` { site { siteMetadata { title description siteUrl site_url: siteUrl } } } `, feeds: [ { serialize: ({ query: { site, allFile } }) => { return allFile.edges.map(edge => { return Object.assign({}, edge.node.childJson.Saletitle, { title:edge.node.childJson.Saletitle, description: edge.node.childJson.Saletitle, date: edge.node.childJson.Date, url: site.siteMetadata.siteUrl + edge.node.fields.slug, guid: site.siteMetadata.siteUrl + edge.node.fields.slug, }) }) }, query: `{ allFile(filter: {extension: {eq: "json"}}, sort: {childrenJson: {Date: DESC}}) { edges { node { fields { slug } childJson { Date Saletitle } } } } }`, output: "/rss.xml", title: "kindleセールチェック RSS Feed", }, ], },