記事の作成中に公開されないようにしたり、公開タイミングを選べるようにするため gatsby-blog に公開フラグを追加した。
要件
- 記事の Front-matter で公開設定する
- 非公開記事があっても URL は変わらない
- console に記事の公開情報を出力する。
実装
gatsby-node.js
front-matter に published を追加し記事から読み取れるようにした。
createPage 処理の前に published の値をチェックして false の場合は実行しないようにした。
フィルターの前で console.log を出力した。
フィルターで処理すると記事の slug が変わってしますので注意
// Get all markdown blog posts sorted by date
const result = await graphql(
`
{
allMarkdownRemark(
sort: { fields: [frontmatter___date], order: ASC }
limit: 1000
) {
nodes {
id
frontmatter {
title
description
published
}
fields {
slug
}
}
}
}
`
)
〜〜〜略〜〜〜
if (posts.length > 0 ) {
posts.forEach((post, index) => {
console.log(post.frontmatter.title + " : " + post.frontmatter.published)
if(post.frontmatter.published != false){
const previousPostId = index === 0 ? null : posts[index - 1].id
const nextPostId = index === posts.length - 1 ? null : posts[index + 1].id
createPage({
path: post.fields.slug,
component: blogPost,
context: {
id: post.id,
previousPostId,
nextPostId,
},
})
}
})
}
〜〜〜略〜〜〜
createTypes(`
type Frontmatter {
title: String
description: String
date: Date @dateformat
published: Boolean
}
`)
index.js
posts に記事情報を代入するときにフィルターをかけて published が false の記事を消す
const posts = data.allMarkdownRemark.nodes.filter(post => post.frontmatter.published != false)
〜〜〜略〜〜〜
export const pageQuery = graphql`
query {
site {
siteMetadata {
title
}
}
allMarkdownRemark(sort: { fields: [frontmatter___date], order: DESC }) {
nodes {
excerpt
fields {
slug
}
frontmatter {
date(formatString: "MMMM DD, YYYY")
title
description
published
}
}
}
}
`
まとめ
記事ごとに設定できて便利
フラグが設定されていない場合は null が入るので表示される
GithubActions のログに公開情報がリストで確認できる
おしまい