Using Gatsby with the WordPress API
Install and setup
# install Gatsby
npm i -g gatsby-cli
# Disable sending usage stats to Gatsby, because i don't like sending stats even if anon
gatsby telemetry --disable
# Create new Gatsby project
gatsby new myProjectName && cd myProjectName
# install WordPress plugin
npm i gatsby-source-wordpress
# Open the project in VS Code
code .
# Start development server
gatsby develop
You can now view gatsby-starter-default in the browser.
http://localhost:8000/
View GraphiQL, an in-browser IDE, to explore your site’s data and schema
http://localhost:8000/___graphql
Configure Gastby plugin
module.exports = {
// ...
plugins: [
// ...
{
resolve: `gatsby-source-wordpress`,
options: {
// Your WordPress source.
baseUrl: `demo.wp-api.org`,
protocol: `https`,
// Only fetches posts, tags and categories from the baseUrl.
includedRoutes: ['**/posts', '**/tags', '**/categories'],
// Not using ACF so putting it off.
useACF: false
}
},
],
}
Environment variables
dotenv
is already a dependency of Gatsby so you don’t need to install it. You can use it in gatsby-config.js
or gatsby-node.js
like so:
// gatsby-config.js
require("dotenv").config({
path: `.env.${process.env.NODE_ENV}`
});
require("dotenv").config()
module.exports = {
// ...
auth: {
jwt_user: process.env.JWT_USER,
jwt_pass: process.env.JWT_PASSWORD,
}
}
Querying data with GraphQL
You need to use the <StaticQuery>
component in order to use GraphQL inside a component (as opposed to a page, for tyhat you use a page query
). The main difference is that page queries can accept variables while StaticQuery does not.
The StaticQuery takes two
import React from "react"
import { StaticQuery, graphql, Link } from "gatsby"
const Posts = ({ data }) => (
/*
`query` from `graphql` only works at the page level
to use `graphql` inside components, you have to use the
<StaticQuery> component
*/
<StaticQuery
// The result of the query is automatically inserted into your React component on the data prop.
query={graphql`
query {
allWordpressPost {
edges {
node {
id
slug
title
content
excerpt
date
modified
}
}
}
}
`}
render={data => (
<div>
<h1>Posts</h1>
<ul>
{data.allWordpressPost.edges.map(post => {
return <li>{post.node.title}</li>
})}
</ul>
</div>
)}
/>
)
export default Posts