
はじめに
Webサイトで上位表示を狙う場合、ページの表示スピードはとても重要です。
WordPress で作成されたページの表示速度改善のため、 Nuxt3 を使いサイトをSSG化することで表示速度の高速化を狙っていきます。いわゆるヘッドレスCMSです。
環境
- WordPress 6.2
- Nuxt3
- MySQL 5.7
実装手順
WordPress環境の構築
dockerを使って WordPress の環境を構築していきます。
ここでは、Docker HubにてWordPress Official Imageの例となっているコードを参照していきます。
version: '3.1'

services:

 wordpress:
 image: wordpress
 restart: always
 ports:
 - 8080:80
 environment:
 WORDPRESS_DB_HOST: db
 WORDPRESS_DB_USER: exampleuser
 WORDPRESS_DB_PASSWORD: examplepass
 WORDPRESS_DB_NAME: exampledb
 volumes:
 - ./backend:/var/www/html

 db:
 image: mysql:5.7
 restart: always
 environment:
 MYSQL_DATABASE: exampledb
 MYSQL_USER: exampleuser
 MYSQL_PASSWORD: examplepass
 MYSQL_RANDOM_ROOT_PASSWORD: '1'
 volumes:
 - db:/var/lib/mysql

volumes:
 wordpress:
 db:
docker compose up
でコンテナを立ち上げると localhost:8080/wp-admin
から WordPress の管理画面へ接続することができるはずです。
ここで忘れてはいけないのは パーマリンク構造をデフォルト(基本)から変更してください。
基本のままだとWP REST APIが表示されないのです。

Nuxt.js環境の構築
Nuxt.jsの環境も構築していきます。
先ほどWordPress環境を構築したdocker-compose.ymlに追記していきます。
version: '3.1'

services:

 wordpress:
 image: wordpress
 restart: always
 ports:
 - 8080:80
 environment:
 WORDPRESS_DB_HOST: db
 WORDPRESS_DB_USER: exampleuser
 WORDPRESS_DB_PASSWORD: examplepass
 WORDPRESS_DB_NAME: exampledb
 volumes:
 - ./backend:/var/www/html

 db:
 image: mysql:5.7
 restart: always
 environment:
 MYSQL_DATABASE: exampledb
 MYSQL_USER: exampleuser
 MYSQL_PASSWORD: examplepass
 MYSQL_RANDOM_ROOT_PASSWORD: '1'
 volumes:
 - db:/var/lib/mysql

# Nuxt.js用追記ここから
 nuxtjs:
 image: node:14
 user: node
 working_dir: /home/node
 tty: true
 ports:
 - 3030:3000
 - 24678:24678
 volumes:
 - ./frontend/:/home/node/
# Nuxt.js用追記ここまで

volumes:
 wordpress:
 db:
再度、ターミナルから docker compose up —build
でDockerを立ち上げ、nuxtjsコンテナ内で操作を行なっていきます。
docker-compose exec nuxtjs bash
npx nuxi init nuxt3-app
cd nuxt3-app
npm install
npm run dev
localhost:3030からNuxt.jsの画面が開くことができると思います。

WordPressの記事をNuxt.js側で取得する
WP REST APIからWordPress側で投稿した記事情報を取得していこうと思います。
WP REST APIはFetch APIを使用して取得していきます。
pagesディレクトリを作成し、 pages/index.vue
に入力していきます。
<script setup>
const { data: posts } = await useFetch('http://localhost:8080/wp-json/wp/v2/posts/');
</script>
<template>
 <ul>
 <li v-for="post in posts" :key="post.id">
 id: {{ post.id }}<br> <!-- 記事ID -->
 slug: {{ post.slug }}<br> <!-- slug -->
 title: {{ post.title.rendered }}<br> <!-- 記事タイトル -->
 contentTitle: <span v-html="post.content.rendered"> </span> <!-- 記事の内容 -->
 </li>
 </ul>
</template>
post.content.rendered
は v-html
ディレクティブを用いて出力してください。
post.content.rendered
をそのまま出力するとサニタイズ処理されてしまい、HTMLタグが文字列として出力されてしまいます。
app.vueのタグを NuxtWelcome
から NuxtPage
へ変更します。
<template>
 <div>
<!-- <NuxtWelcome />-->
 <NuxtPage />
 </div>
</template>
localhost:3030
で記事情報が取得できていることを確認してください。
最後に
以上が Nuxt.js のSSGを用いて WordPress の記事を表示する手順でした。
これから WordPress のヘッドレスCMS化を考えている方は是非ご参考にしてください。