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",
},
],
},