LoginSignup
0
0

Gatsbyでjsonから記事を生成する

Last updated at Posted at 2023-09-16

gatsby-starter-blogのMDをJSONに入れ替えて記事を生成する。初期い状態ではcontent→blogフォルダー内のMDを読み込む設定になっている。
gatsby-transformer-jsonをインストールして、jsonファイルを読み込む。ここではjsonファイルはstaticフォルダーに入れている
がほかのフォルダーでも構わない。optionsにtypeNameを設定しないと、先頭が数字のファイル名であれば読み込みが止まる場合がある

    {
      resolve: `gatsby-transformer-json`,
      options: {
        typeName: `Json`, // a fixed string
      },
    },
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `data`,
        path: `${__dirname}/static/json/`,
      },
    },

読み込むjsonファイルは次のものを例として、PA-APIで取得したamazonのアフィリエイト用の情報をjsonとして扱いやすくしたもの。このJSONデータからブログの記事にアフィリエイトを埋め込む。

[ {
  "Asin": "B0C85B1Q2D",
  "URL": "https://www.amazon.co.jp/dp/B0C85B1Q2D?tag=99-22&linkCode=ogi&th=1&psc=1",
  "ImageURL": "https://m.media-amazon.com/images/I/51LcTROqGsL._SL500_.jpg",
  "Publisher": "芳文社",
  "Contributor": "はまじあき(著)",
  "Booktype": "Kindle版",
  "Title": "ぼっち・ざ・ろっく! 6巻 (まんがタイムKRコミックス)",
  "Price": 842,
  "Category": "コミック,Custom Stores,4コマまんが",
  "Points": 8,
  "Day": "other",
  "Saletitle": "その他",
  "Date": "2023-09-16 23:02:24"
 },
...
]

graphqlのqueryはまず、json全体を取得する例。これではフォルダーに入れたjsonファイルが一緒くたにされて検索される。


query MyQuery {
  allJson {
    edges {
      node {
        Asin
        Booktype
        Category
        Contributor
        ImageURL
        Points
        Price
        Publisher
        Title
        URL
      }
    }
  }
}

一ファイルを一記事として出力するには、ファイルごとにjsonの中身を取得したい。
gatsby-node.jsには記事を一括生成する機能があるのでjsongファイルを読み込んで記事を生成する。
node.internal.mediaType === 'application/json'
と指定することで、jsonファイルにノードを追加する。ここではファイル名をslugにしている。slugをもとに記事を作成するがfilter: {extension: {eq: "json"}}で拡張子がjsonファイルのものだけに制限している。

exports.createPages = async ({ graphql, actions, getNode }) => {
const { createPage } = actions
const result = await graphql(`
query MyQuery {
allFile(filter: {extension: {eq: "json"}}) {
  edges {
    node {
      fields {
        slug
      }
    }
  }
}
}
`)

exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions
if (node.internal.mediaType === 'application/json') {
//console.log(node)
  const value = createFilePath({ node, getNode})
   createNodeField({
    node,
    name: `slug`,
    value,
  })
}

blog-post.jsでテンプレートファイルにjsonデータを入れて、記事の中身を作る。slugを受け取ってからfileをslugで絞り込んでslugごとにjsonファイルを読み込んでいる。

query MyQuery($slug: String!)  {
  file(extension: {eq: "json"},fields: {slug: { eq: $slug } }) {
    childrenJson {
      Asin
      Booktype
      Category
      Contributor
      ImageURL
      Points
      Price
      Publisher
      Title
      URL
      Saletitle
      Date(formatString: "YYYY年MM月DD日")
    }
      fields {
      slug
    }
  }
      site {
      siteMetadata {
        title
        siteUrl
      }
    }
}

JSONから記事を生成して作ったサイト

サイトのコード

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0