Gatsbyに下書きを投稿できるようにする

※予定投稿ではありません

初期段階だと下書きができないので、md ファイルはあるけど公開しないための下書き機能を追加します。プラグインは使いません。 作業手順のたびに、ローカルを再起動してください。

post に draft を追加する

まずは draft を追加します。boolean しか入れない予定。 (承認とか別のフローを使いたいときは、status とかにするといいのかも)

ここを変えたら一旦サーバを再起動します。

2020_09_19_draft.md
---
title: 'Gatsbyに下書きを投稿する'
published: '2020-09-19'

draft: false

tags: ['Gatsby', 'draft', '下書き']
---

クエリを追加する

allMarkdownRemark クエリを実行するすべてのページに次のフィルターを追加します。

    ...
    allMarkdownRemark(
-      sort: { fields: [frontmatter___date], order: DESC }
+      sort: { fields: [frontmatter___date], order: DESC },
+      filter: { frontmatter: { draft: { eq: false } } }
    ) {
    ...

gatsby-node.js のクエリを編集

development の時だけページにアクセスできればいいので、フィルタを以下のようにします。

    `{
-      allMarkdownRemark(sort: {fields: [frontmatter___date], order: DESC}, limit: 1000) {
+      allMarkdownRemark(
+       sort: {fields: [frontmatter___date], order: DESC},
+         ${
+           process.env.NODE_ENV === 'production' ?
+           'filter: {frontmatter: {draft: {eq: false}}}' :
+           ''
+         }
+         limit: 1000
+      ) {
       edges {
        ...

gatsby-config.js の RSS フィード部分を追加

RSS フィードの生成中に投稿の下書きをスキップするように追記します。

...
-  `gatsby-plugin-feed`,
+  {
+     resolve: `gatsby-plugin-feed`,
+     options: {
+       feeds: [
+         {
+           query: `
+           {
+             allMarkdownRemark(
+               limit: 1000,
+               sort: {order: DESC, fields: [frontmatter___date]},
+               filter: {frontmatter: {draft: {eq: false}}}
+             ) {
+               edges {
+                 node {
+                   excerpt
+                   html
+                   fields {
+                     slug
+                   }
+                   frontmatter {
+                     title
+                     date
+                   }
+                 }
+               }
+             }
+           }
+           `,
+           output: `rss.xml`
+         },
+       ]
+     }
+ },

これで、draft: true にした記事はビルド時にはスキップされ、開発時には利用できるようになります。 (記事一覧には開発時でも出てきません。表示したい場合はクエリを編集してください)
他にフィードを利用している場合は、そちらにもフィルタを適用するとよいです。

ほぼ参考サイトのままでした・・。

参考