Nuxt.jsでWordPressの記事をNetlifyにデプロイする方法を紹介します。
WordPressの記事データはREST API(JSON形式)で取得し、phpファイルではなく、静的ファイルでジェネレートしてNetlifyにデプロイします。
NetlifyはGithubにpushするだけでデプロイを行ってくれるので便利です。もちろん記事投稿のフックもあります。
今回はアウトプット会用のため、ざっくり版になってしまいましたが、後日書き直します。
あとREST APIのサイトは見辛いので、英語ですけど公式Handbookの方が調べるのに良いです。
今回必要なもの
- コードを書ける環境
- 稼働中のWordPress
- GitHubのアカウント(じゃなくてもいいけど楽)
- Netlifyのアカウント(じゃなくてもいいけど楽)
- 諦めない心
今回の流れ
- Nuxt.jsで記事取得用のページを作る
- AxiosでWordPressの記事データを引っ張ってくる
- 静的ファイルの出力設定をする
- GitHubにリポジトリを作る
- NetlifyにGitHubのリポジトリを登録
- デプロイ(とりあえず見れる状態)
必要なパッケージ
Nuxt.js(nuxt)本体と、API通信に使うAxios(@nuxtjs/axios)が必要になります。他はお好きにどうぞ。
基本的にはこれだけです。メディアもちゃんと取れます。
Axiosの設定
Nuxt.jsでREST APIと通信するため、まずはnuxt.config.jsでAxiosを使えるように設定を記述します。
nuxt.config.js
const axios = require('axios')
// 下記はサンプルです。取得したいAPIのURLを入れてください
const = 'https://www.expexp.jp/wp-json/wp/v2/'
module.exports = {
// generateの設定は後述
head: {
// 略
},
modules: [ '@nuxtjs/axios' ],
axios: { baseURL: apiURL }
}
記事出力用ページの作成
Nuxt.jsでWordPressの記事を出力するページを用意します。WordPressであればindex.phpとかsingle.phpとかに当たるものです。
REST APIでpostsデータを取得し、いい感じに出力します。今回は記事一覧と詳細しかやらないけど、カテゴリーやタグページも作れます。
index.vue(例)
記事一覧ページ。WordPressで言うとArchiveとかの一覧系ページ。
<template>
<!-- Vueのコードは略! 例:postsをv-forなどで展開 -->
</template>
export default {
data () {
return {
// Axiosで取得したWPの記事データを入れる箱を用意
posts: {}
}
},
async asyncData ({ $axios }) {
return await $axios.get(`${$axios.defaults.baseURL}posts?_embed`, {
params: {
// 取得したいページ、記事数
// 必須ではないけど、明示しておくとわかりやすい。下記はデフォルト。詳しくはHandbook
page: 1,
per_page: 10
}
})
.then(response => {
return {
posts: response.data
}
})
}
}
_id.vue(例)
<template>
<!-- Vueのコードは略! postに記事データを入れるので、それを出力 -->
</template>
export default {
data () {
return {
// Axiosで取得したWPの記事データを入れる箱を用意
post: {}
}
},
async asyncData ({ $axios, params }) {
return await $axios.get(`${$axios.defaults.baseURL}posts/${params.id}`)
.then(response => {
return {
post: response.data
}
})
}
}
記事詳細ページ。singleとかpageとか。記事IDでページを作成するが、WordPress側のパーマリンクが基本(?p=123)になってるとREST APIが使えないので要注意。
静的ファイル出力用設定
後回しにしていたgenerateの設定です。
なぜ設定が必要か?
Nuxt.jsのルーティングでは、WordPressの記事(_id.vue)をbuild出来ません。つまり静的ファイルが生成されません。
そこでconfigでgenerateの設定が必要になります。
nuxt.config.js
const axios = require('axios')
// 下記はサンプルです。取得したいAPIのURLを入れてください
const = 'https://www.expexp.jp/wp-json/wp/v2/'
module.exports = {
// 取得する記事を静的ファイルにするための処理
generate: {
routes (callback) {
axios.get(`${apiURL}posts`).then(response => {
// WordPressの総記事数を取得
const totalPosts = response.headers['x-wp-total']
// 記事、カテゴリー、タグなどを取得
Promise.all([
axios.get(`${apiURL}posts?per_page=${totalPosts}`),
// 下記はカテゴリーページも作る例
axios.get(`${apiURL}categories`)
])
.then (axios.spread(function (posts, categories) {
let routes1 = posts.data.map((post) => {
return {
route: `/blog/${post.id}`,
payload: post
}
})
let routes2 = categories.data.map((category) => {
return `/blog/category/${category.slug}`
})
callback (null, routes1.concat(routes2))
}))
})
}
},
env: {
// そのほかの設定は略
}
}
これで記事の静的ファイルも作られる。
GitHubにリポジトリを作る
今回の内容でリポジトリを作ってください。
デプロイ設定
NetlifyにアクセスしてGitHubと連携してください。GitHubのアカウントでNetlifyにログインしていると楽。
「New site form Git」ボタンからGitHubのリポジトリとNetlifyを繋ぎます。接続するとデプロイ出来るようになるので、早速デプロイしましょう。エラーが無ければ、https://XXXXXXX.netlify.comみたいなURLが作成されます。あとWordPress側で海外IPを弾かない設定にしないとエラーになりますので要注意です。
以上です!