├── .gitignore
├── .markdownlint.json
├── .vscode
└── spellright.dict
├── LICENSE
├── README.md
├── gatsby-config.js
├── gatsby-node.js
├── package-lock.json
├── package.json
└── src
├── components
├── header.js
├── image.js
├── layout.css
├── layout.js
└── seo.js
├── images
├── gatsby-astronaut.png
└── gatsby-icon.png
├── layouts
└── index.js
├── pages
├── 404.js
└── index.js
├── templates
└── post.js
└── utils
└── typography.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # NPM #
2 | ##########
3 | # Ignore all directories called node_modules in current folder and any subfolders.
4 | node_modules/
5 | /node_modules/
6 |
7 | # Packages #
8 | ############
9 | *.7z
10 | *.dmg
11 | *.gz
12 | *.bz2
13 | *.iso
14 | *.jar
15 | *.rar
16 | *.tar
17 | *.zip
18 | *.tgz
19 | *.map
20 |
21 | # Logs and databases #
22 | ######################
23 | *.log
24 | *.sql
25 | *.env
26 |
27 | # OS generated files #
28 | ######################
29 | **.DS_Store*
30 | ehthumbs.db
31 | Icon?
32 | Thumbs.db
33 | ._*
34 |
35 | # Vim generated files #
36 | ######################
37 | *.un~
38 |
39 | # SASS #
40 | ##########
41 | **/.sass-cache
42 | **/.sass-cache/*
43 | **/.map
44 |
45 | # Composer #
46 | ##########
47 | !assets/js/vendor/
48 | wpcs/
49 | /vendor/
50 |
51 | # Bower #
52 | ##########
53 | assets/bower_components/*
54 |
55 | # Codekit #
56 | ##########
57 | /codekit-config.json
58 | *.codekit
59 | **.codekit-cache/*
60 |
61 | # Compiled Files and Build Dirs #
62 | ##########
63 | /README.html
64 |
65 | # PhpStrom Project Files #
66 | .idea/
67 | library/vendors/composer
68 | assets/img/.DS_Store
69 |
70 | # VSCode related files #
71 | # .vscode
72 | # Gatsby related
73 | public
74 | .cache
75 |
--------------------------------------------------------------------------------
/.markdownlint.json:
--------------------------------------------------------------------------------
1 | {
2 | "MD010": false,
3 | "MD013": false,
4 | "MD033": false
5 | }
6 |
--------------------------------------------------------------------------------
/.vscode/spellright.dict:
--------------------------------------------------------------------------------
1 | posts
2 | ags
3 | ategories
4 | osts
5 | wordpress
6 | gatsby
7 | lodash
8 | dom
9 | npm
10 | js
11 | jsx
12 | graphql
13 | destructuring
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 gatsbyjs
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | Gatsby & WordPress Integration
4 |
5 |
6 |
7 |
8 | Building static sites with `React.js` using **Gatsby** provides an **easy to deploy setup**, **blazing fast speed**, and **smooth developer experience**. JAMstack (JavaScript APIs Markup) is awesome and I am going to show you why it has become such a popular tool by demonstrating how you can leverage Gatsby to supercharge your next WordPress site.
9 |
10 | First we are going to configure a basic Gatsby project setup. And then we'll use it to fetch data from our WordPress site.
11 |
12 | ## Integrating Gatsby.js with WordPress
13 |
14 |
15 | Step #0: Don't have a Gatsby site setup? Read this. (CLICK TO EXPAND!)
16 |
17 | If this is your first time with Gatsby.js, all you need to do is follow these steps mentioned below. These will help you set up a basic Gatsby project.
18 |
19 | - Install the Gatsby CLI by typing the following command in your terminal
20 |
21 | ```sh
22 | npm install -g gatsby-cli
23 | ```
24 |
25 | - Next, create a new Gatsby.js site through the following.
26 |
27 | ```sh
28 | gatsby new site-name
29 | ```
30 |
31 | - To access your site folder contents type the following.
32 |
33 | ```sh
34 | cd site-name
35 | ```
36 |
37 | - Finally, start the development server to begin building your Gatsby.js site.
38 |
39 | ```sh
40 | gatsby develop
41 | ```
42 |
43 |
44 |
45 | ### #1: Install `gatsby-source-wordpress` Plugin
46 |
47 | If you have a WordPress site and you want to have its front-end built with Gatsby.js all you need to do is pull the existing data into your static Gatsby site. You can do that with the `gatsby-source-wordpress` plugin.
48 |
49 | Inside your terminal type the following to install this plugin.
50 |
51 | ```sh
52 | npm install gatsby-source-wordpress
53 | ```
54 |
55 | ### #2: Configuring the plugin
56 |
57 | Inside your `gatsby-config.js` file, add the configuration options which includes your WordPress site’s `baseUrl`, `protocol`, whether it’s hosted on WordPress.com or self-hosted i.e., `hostingWPCOM`, and whether it uses the Advanced Custom Fields (ACF) plugin or not `useACF` Also, we are going to mention all the `includedRoutes` which tells what data do we exactly want to fetch.
58 |
59 | Inside your `gatsby-config.js` file, the configuration options looks like this:
60 |
61 | ```js
62 | module.exports = {
63 | // ...
64 | plugins: [
65 | // ...
66 | {
67 | resolve: `gatsby-source-wordpress`,
68 | options: {
69 | // Your WordPress source.
70 | baseUrl: `demo.wp-api.org`,
71 | protocol: `https`,
72 | // Only fetches posts, tags and categories from the baseUrl.
73 | includedRoutes: ['**/posts', '**/tags', '**/categories'],
74 | // Not using ACF so putting it off.
75 | useACF: false
76 | }
77 | },
78 | ],
79 | }
80 | ```
81 |
82 | ### #3: Using the Fetched WordPress Data
83 |
84 | Once your Gatsby site is fetching data from your WordPress source URL, next you'll create your site pages. This is done by implementing the `createPages` API in the `gatsby-node.js`.
85 |
86 | This makes your fetched data available to be queried with GraphQL. At `build` time, the `gatsby-source-wordpress` plugin fetches your data, and use it to ”automatically infer a GraphQL schema” which you can query against.
87 |
88 | Here's the code of the `gatsby-node.js` file which iterates the WordPress post data.
89 |
90 | ```js
91 | /**
92 | * Implement Gatsby's Node APIs in this file.
93 | *
94 | * See: https://www.gatsbyjs.org/docs/node-apis/
95 | */
96 |
97 | const path = require(`path`);
98 | const slash = require(`slash`);
99 |
100 | /**
101 | * Implement the Gatsby API “createPages”. This is
102 | * called after the Gatsby bootstrap is finished so you have
103 | * access to any information necessary to programmatically
104 | * create pages.
105 | * Will create pages for WordPress pages (route : /{slug})
106 | * Will create pages for WordPress posts (route : /post/{slug})
107 | */
108 | exports.createPages = async ({ graphql, actions }) => {
109 | const { createPage } = actions;
110 |
111 | /*
112 | * The “graphql” function allows us to run arbitrary
113 | * queries against the local Gatsby GraphQL schema. Think of
114 | * it like the site has a built-in database constructed
115 | * from the fetched data that you can run queries against.
116 | */
117 | const result = await graphql(`
118 | {
119 | allWordpressPost {
120 | edges {
121 | node {
122 | id
123 | slug
124 | status
125 | template
126 | format
127 | }
128 | }
129 | }
130 | }
131 | `);
132 |
133 | // Check for any errors.
134 | if (result.errors) {
135 | throw new Error(result.errors);
136 | }
137 |
138 | // Access query results via object destructuring.
139 | const { allWordpressPost } = result.data;
140 | const postTemplate = path.resolve(`./src/templates/post.js`);
141 |
142 | /*
143 | * We want to create a detailed page for each
144 | * post node. We'll just use the WordPress Slug for the slug.
145 | * The Post ID is prefixed with 'POST_'
146 | */
147 | allWordpressPost.edges.forEach(edge => {
148 | createPage({
149 | path: `/${edge.node.slug}/`,
150 | component: slash(postTemplate),
151 | context: {
152 | id: edge.node.id
153 | }
154 | });
155 | });
156 | };
157 | ```
158 |
159 | ### #4: Create a `post.js` Template
160 |
161 | Then, create a folder for templates and add files for posts, pages, layouts, etc. For now, I am creating a `post.js` file since I am fetching the posts from my WordPress site.
162 |
163 | Here's the code:
164 |
165 | ``` js
166 | import { graphql } from 'gatsby';
167 | import PropTypes from 'prop-types';
168 | import React, { Component } from 'react';
169 | import Layout from '../layouts';
170 |
171 | class PostTemplate extends Component {
172 | render() {
173 | const post = this.props.data.wordpressPost;
174 |
175 | return (
176 |
177 |
178 |
179 |
180 | );
181 | }
182 | }
183 |
184 | PostTemplate.propTypes = {
185 | data: PropTypes.object.isRequired,
186 | edges: PropTypes.array
187 | };
188 |
189 | export default PostTemplate;
190 |
191 | export const pageQuery = graphql`
192 | query($id: String!) {
193 | wordpressPost(id: { eq: $id }) {
194 | title
195 | content
196 | }
197 | }
198 | `;
199 |
200 | ```
201 |
202 | ### #5: Final Result
203 |
204 | To start the development server to view the final result type the following command.
205 |
206 | ```sh
207 | npm start
208 | ```
209 |
210 | You get the link from where you can access the site locally along with other details like no. of posts, categories and tags that are being fetched.
211 |
212 | > 👋 **[Follow @MaedahBatool on Twitter](https://twitter.com/MaedahBatool/) →**
213 |
--------------------------------------------------------------------------------
/gatsby-config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | siteMetadata: {
3 | title: `Gatsby Default Starter`,
4 | description: `Kick off your next, great Gatsby project with this default starter. This barebones starter ships with the main Gatsby configuration files you might need.`,
5 | author: `@MaedahBatool`
6 | },
7 | plugins: [
8 | `gatsby-plugin-react-helmet`,
9 | {
10 | resolve: `gatsby-source-filesystem`,
11 | options: {
12 | name: `images`,
13 | path: `${__dirname}/src/images`
14 | }
15 | },
16 | `gatsby-transformer-sharp`,
17 | `gatsby-plugin-sharp`,
18 | {
19 | resolve: `gatsby-plugin-manifest`,
20 | options: {
21 | name: `gatsby-starter-default`,
22 | short_name: `starter`,
23 | start_url: `/`,
24 | background_color: `#663399`,
25 | theme_color: `#663399`,
26 | display: `minimal-ui`,
27 | icon: `src/images/gatsby-icon.png` // This path is relative to the root of the site.
28 | }
29 | },
30 | // @TODO: STEP #1: Configure WordPress Backend as a source.
31 | {
32 | resolve: `gatsby-source-wordpress`,
33 | options: {
34 | // Your WordPress source.
35 | baseUrl: `demo.wp-api.org`,
36 | protocol: `https`,
37 | // Only fetches posts, tags and categories from the baseUrl.
38 | includedRoutes: ['**/posts', '**/tags', '**/categories'],
39 | // Not using ACF so putting it off.
40 | useACF: false
41 | }
42 | },
43 | `gatsby-plugin-glamor`,
44 | `gatsby-plugin-offline`
45 | ]
46 | };
47 |
--------------------------------------------------------------------------------
/gatsby-node.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Implement Gatsby's Node APIs in this file.
3 | *
4 | * See: https://www.gatsbyjs.org/docs/node-apis/
5 | */
6 |
7 | // You can delete this file if you're not using it
8 |
9 | const path = require(`path`);
10 | const slash = require(`slash`);
11 |
12 | /** Implement the Gatsby API “createPages”. This is
13 | * called after the Gatsby bootstrap is finished so you have
14 | * access to any information necessary to programmatically
15 | * create pages.
16 | * Will create pages for WordPress pages (route : /{slug})
17 | * Will create pages for WordPress posts (route : /post/{slug})
18 | */
19 | exports.createPages = async ({ graphql, actions }) => {
20 | const { createPage } = actions;
21 |
22 | // @TODO: STEP #2: Query all WordPress Posts Data.
23 | /** The “graphql” function allows us to run arbitrary
24 | * queries against the local Gatsby GraphQL schema. Think of
25 | * it like the site has a built-in database constructed
26 | * from the fetched data that you can run queries against.
27 | */
28 | const result = await graphql(`
29 | {
30 | allWordpressPost {
31 | edges {
32 | node {
33 | id
34 | slug
35 | status
36 | template
37 | format
38 | }
39 | }
40 | }
41 | }
42 | `);
43 |
44 | // Check for any errors
45 | if (result.errors) {
46 | throw new Error(result.errors);
47 | }
48 |
49 | // Access query results via object destructuring.
50 | const { allWordpressPost } = result.data;
51 |
52 | const postTemplate = path.resolve(`./src/templates/post.js`);
53 |
54 | // @TODO: STEP #3: Create pages in Gatsby with WordPress Posts Data.
55 | /**
56 | * We want to create a detailed page for each
57 | * post node. We'll just use the WordPress Slug for the slug.
58 | * The Post ID is prefixed with 'POST_'
59 | */
60 | allWordpressPost.edges.forEach(edge => {
61 | createPage({
62 | path: `/${edge.node.slug}/`,
63 | component: slash(postTemplate),
64 | context: {
65 | id: edge.node.id
66 | }
67 | });
68 | });
69 | };
70 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gatsby-with-wordpress",
3 | "private": true,
4 | "description": "A simple integration to quickly convert your WordPress site to Gatsby.",
5 | "version": "0.1.0",
6 | "author": "Maedah Batool",
7 | "dependencies": {
8 | "gatsby": "^2.5.0",
9 | "gatsby-image": "^2.1.0",
10 | "gatsby-plugin-glamor": "^2.0.9",
11 | "gatsby-plugin-manifest": "^2.1.1",
12 | "gatsby-plugin-offline": "^2.1.0",
13 | "gatsby-plugin-react-helmet": "^3.0.12",
14 | "gatsby-plugin-sharp": "^2.0.37",
15 | "gatsby-source-filesystem": "^2.0.36",
16 | "gatsby-source-wordpress": "^3.0.61",
17 | "gatsby-transformer-sharp": "^2.1.19",
18 | "glamor": "^2.20.40",
19 | "lodash": "^4.17.11",
20 | "prop-types": "^15.7.2",
21 | "react": "^16.8.6",
22 | "react-dom": "^16.8.6",
23 | "react-helmet": "^5.2.1",
24 | "react-typography": "^0.16.19",
25 | "slash": "^3.0.0",
26 | "typography": "^0.16.19",
27 | "typography-theme-wordpress-2013": "^0.16.19"
28 | },
29 | "devDependencies": {
30 | "prettier": "^1.17.1"
31 | },
32 | "keywords": [
33 | "gatsby"
34 | ],
35 | "license": "MIT",
36 | "scripts": {
37 | "build": "gatsby build",
38 | "develop": "gatsby develop",
39 | "format": "prettier --write src/**/*.{js,jsx}",
40 | "start": "npm run develop",
41 | "serve": "gatsby serve",
42 | "test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\""
43 | },
44 | "repository": {
45 | "type": "git",
46 | "url": "https://github.com/gatsbyjs/gatsby-starter-default"
47 | },
48 | "bugs": {
49 | "url": "https://github.com/gatsbyjs/gatsby/issues"
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/components/header.js:
--------------------------------------------------------------------------------
1 | import { Link } from "gatsby"
2 | import PropTypes from "prop-types"
3 | import React from "react"
4 |
5 | const Header = ({ siteTitle }) => (
6 |
12 |