- 1. 参考書籍
- 2. WordPress画像ファイルのサーバ移行
- 1. Netlifyへのアップロード(旧手順)
- 2. VPSサーバへのアップロード(新手順)
- 3. WordPressDBデータのエクスポート
- 1. 新形式で必要なデータの策定
- 1. カテゴリとタグ
- 1. WordPressのデータ構成
- 2. 新形式のデータ構成
- 2. 投稿データ
- 1. WordPressのデータ構成
- 2. 新形式のデータ構成
- 2. エクスポート処理の作成
- 4. Next.js上でデータを表示する
- 1. マスタデータの読込
- 2. マスタデータの表示
- 1. 記事一覧ページ
- 2. 記事ページ
- 5. その他の機能移行
- 1. CSSスタイリングの移行
- 2. サイドバーウィジェット
- 3. カテゴリや検索ワードによる絞り込み
- 4. ペジネーション
- 5. 記事内の外部スクリプト読込
- 6. 未実装の機能
- 7. おわりに

マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ〜〜

マイケル
この度、WordPress製だった当ブログをNext.jsで作り直しました!
前回は環境構築周りに触れましたので、今回は実際にWordPressのデータを移行して表示するまでの流れについて紹介します。

【都会のエレキベア】ブログを大幅リニューアル!WordPressからNext.jsに移行するまでの流れをまとめる
2024-01-01

【Next.js】第一回 WordPressブログをNext.jsに移行する 〜全体設計、環境構築編〜
2023-12-31

【Next.js】第二回 WordPressブログをNext.jsに移行する 〜WordPressデータの移行・表示編〜
2023-12-31

【Next.js】第三回 WordPressブログをNext.jsに移行する 〜Markdown執筆環境構築編〜
2023-12-31

【Next.js】第四回 WordPressブログをNext.jsに移行する 〜サーバ移行・SEO・広告設定編〜
2023-12-31

エレキベア
環境構築も中々大変だったクマね

マイケル
第二回ということで、「WordPressデータの移行・表示」編です!
取得したデータを使って、下記の2つのページを作るところまで解説します!

▲記事一覧ページ

▲記事ページ

▲検索処理やカテゴリによるフィルタにも対応する

エレキベア
今回がNext.js環境移行の肝になりそうクマね

マイケル
また、コードについても公開できる範囲でGitHubに上げているので、こちらも合わせてご参考ください!
GitHub - nextjs-elekibear-blog-scripts

エレキベア
中々なボリュームクマ・・・
参考書籍

マイケル
Next.jsでの開発を進めるにあたり、下記書籍を参考にさせていただきました!

TypeScriptとReact/Next.jsでつくる実践Webアプリケーション

エレキベア
最近のWeb技術をキャッチアップしたい方にはおすすめクマね

マイケル
また、WordPressの学習については下記書籍がおすすめです!
WordPressは初心者本が多い中、こちらはアーキテクチャ等エンジニア目線で書かれているため非常に分かりやすいです。


エレキベア
WordPressは結構癖があるクマからね
WordPress画像ファイルのサーバ移行
※追記※Netlifyサーバでの運用では、Bandwidth(帯域幅)の領域が100GBギリギリとなってしまったため、 現在はVPSサーバを用意してそちらに格納する運用にしています。
参考として双方の方法について記載しています。
Netlifyへのアップロード(旧手順)

マイケル
まずは画像ファイル類の移行についてです。
前回記事に書いた通りアプリケーションとは別のサーバで管理するため、
[WordPressサーバ]/public_html/wp-content/uploads
配下のファイルを全てNetlifyサーバへアップロードします。

マイケル
アップロードはNetlifyCLI経由で行いました。
下記のように作成したサイトと紐づけることでアップロードできます。

マイケル
記事内の画像リンクをアップロードしたURLに合わせるため、
後ほどデータをエクスポートした後に一括置換で対応します。
URL | |
---|---|
置換前 | [WordPressサーバ]/public_html/wp-content/uploads |
置換後 | [NetlifyサーバURL]/wp-content/uploads |

エレキベア
これで画像サーバの準備は完了クマね
VPSサーバへのアップロード(新手順)

マイケル
上記のNetlifyへ格納する運用では帯域幅が耐えきれなかったため、独自でVPSサーバを契約して格納する方式にしました。
ファイル同期は下記のようにrsyncコマンドを使用しています。

エレキベア
やはり全てNetlifyでは厳しかったクマか・・・
WordPressDBデータのエクスポート
新形式で必要なデータの策定

マイケル
次はWordPressのDBデータの移行についてです。
前回記事に書いた内容通り、下記のようにマスタデータはCSVで管理する方針にしましたが
全てのデータが必要なわけではないため必要なデータの策定から行います。

▲WordPressデータはCSVで管理する

エレキベア
WordPressのデータは結構ごちゃごちゃしてるのもあるクマから
これを気に整理したいクマね

マイケル
WordPressのDB構成については下記に記載されています。
柔軟に拡張できる形式になっている分、個人ブログだと無駄が多いというのも確かです。
WordPress - Database Desctiption

マイケル
この中で当ブログで使用したいデータは主に
・カテゴリとタグ関連
・記事データ関連
になるため、この辺りを中心に整理していきます。
カテゴリとタグ

マイケル
カテゴリ、タグの管理について使用しているテーブルは
・wp_terms
・wp_term_taxonomy
・wp_term_relationships
の三つです。
WordPressのデータ構成
テーブル名 | 概要 |
---|---|
wp_terms | 分類の定義 |
wp_term_taxonomy | 分類の種類(カテゴリ、タグ)の指定 |
wp_term_relationships | 分類と投稿データの紐付け |

マイケル
この中でwp_term_taxonomyのデータについてはまとめられそうだったので、
・mst_terms
・mst_term_relationships
の二つのデータに下記形式で整理することにしました。
新形式のデータ構成
マスタ名 | 概要 |
---|---|
mst_terms | 分類(カテゴリorタグ)の定義 |
mst_term_relationships | 分類と投稿データの紐付け |
mst_terms
カラム名 | 概要 |
---|---|
id | 分類ID |
name | 名前 |
slug | スラッグ |
taxonomy | 分類種別(カテゴリ or タグ) |
parent | 親ID |
mst_term_relationships
カラム名 | 概要 |
---|---|
post_id | 投稿データのID |
term_id | 分類ID |

エレキベア
基本はmst_termsで管理して、記事データとの紐付けのみmst_term_relationshipsを使用するクマね
この方がシンプルで分かりやすそうクマ
投稿データ

マイケル
そして記事の投稿データについても
・mst_posts
の一つのデータとして集約することにしました。
WordPress、新形式のデータ構成はそれぞれ下記のようになります。
WordPressのデータ構成
新形式のデータ構成
mst_posts
カラム名 | 概要 |
---|---|
id | 投稿ID |
post_date | 投稿日 |
post_title | タイトル |
post_name | 投稿名(slug) |
post_modified | 更新日 |
post_type | 投稿種別 |
featured_image | アイキャッチ画像 |

エレキベア
元々metaデータ等で分かれていた部分も集約したのクマね

マイケル
一点、実際の記事内容(post_content)については、
・一つ一つの容量がある
・WordPress内で変換された後の記事データを使用したい
といった理由から、別途APIでアクセスしてテキストファイル形式で書き出すことにしました。

マイケル
今回は下記のような形で WPGraphQL 経由で取得したデータを出力することにします。

エレキベア
ショートコードとかWordPress内で変換されるデータがあるクマね
確かにその辺りも含めてHTMLに変換されたデータを使用した方が楽そうクマ
エクスポート処理の作成

マイケル
以上のデータ構成からCSV、テキストファイルを書き出すツールを作成してみます。
今回はPythonで実装して、GitHubにもアップしています。
GitHub - python-wp-db-output-tools
▲マスタCSVデータ出力処理の例
▲記事テキストデータの出力例

エレキベア
ちょっとした処理を書くのにPythonは便利クマね

マイケル
最後に、出力した記事テキスト内のURLを新しい形式に変換します。
1. で用意した画像ファイルサーバURLに置き換えるのと、ルーティングパスも新しい形式に置き換えています。

エレキベア
これでデータの用意はできたクマね
Next.js上でデータを表示する

マイケル
それでは用意したデータを、実際にNext.jsプロジェクト側で読み込んで表示してみます。
マスタデータの読込

マイケル
マスタデータを読み込むため、まずはデータ型の定義を追加します。
今回はマスタデータ自体の型と、それを用いて返すレスポンス型を定義しました。
▲マスタデータ関連の型定義

マイケル
そして実際の読込処理を実装します。
下記のようにCSVから読み込んだデータを定義した型に変換して返す処理にしました。
▲CSVファイルからのデータ読込

マイケル
あとはこれらのデータをレスポンス形式に変換する関数を用意してあげれば準備は完了です。
読み込んだデータをレスポンス形式に変換する

エレキベア
あとはこのAPIから取得したデータを表示するクマね
マスタデータの表示
記事一覧ページ

マイケル
用意したAPIを呼び出して、データを表示してみます。
まずトップとなる記事一覧ページは下記のようになっていました。


マイケル
今回は記事データを事前に全て取得しておき、SPAでページに表示させる記事カードを制御する方向で実装しました。
実装としては下記のようになります。
▲記事一覧ページの実装

エレキベア
SSGで実装する場合、getStaticPropsで事前にデータを取得しておくのだったクマね

マイケル
PostCardListコンポーネント内でデータをループすることで、記事カードを表示しています。
▲記事カードリストコンポーネントの実装

エレキベア
基本データ取得して表示するだけクマからシンプルクマね
記事ページ

マイケル
次に記事ページの実装についてです。


マイケル
こちらもデータ取得して表示する流れは同じですが、記事データの数だけpageが存在するため、getStaticPaths内で事前にパスを定義しておく必要があります。
▲記事ページの実装

エレキベア
getStaticPathsは最初の一度のみパスを定義するために呼ばれて
getStaticPropsはページ毎に呼ばれるクマね

マイケル
実際に記事データを表示しているHtmlTextPostContentコンポーネントは下記のようになっています。
初めはreact-html-parser等を使用してReactElementに変換するのも検討したのですが、それだと外部スクリプトによる影響でエラーが発生してしまう場合があったため最終的にdangerouslySetInnerHTMLに設定することで表示しています。
▲テキスト記事の表示コンポーネント実装

マイケル
なお、記事データの目次抽出と画像をポップアップさせる対応を入れるためにcheerioというライブラリを利用して操作しています。
HTML文字列をjQueryライクに操作できるので楽しいです!

エレキベア
これでメインの二画面は表示できるようになったクマね
その他の機能移行

マイケル
その他、行った対応についてもいくつか紹介します!
CSSスタイリングの移行

マイケル
まずはWordPressで実装されているCSSの移行についてです。
テキスト記事内に埋め込まれたクラス等を全て移行するのはかなり手間がかかりそうだったため、今回は一部をグローバルCSSとして設定することで対処しています。
▲WordPressのCSS定義
▲グローバルCSSとして設定

エレキベア
むむむ・・・
まあコストを考えるとある程度は仕方ないクマか・・・
サイドバーウィジェット

マイケル
次にサイドバーに表示していたウィジェットについて!

▲サイドバーウィジェット

マイケル
こちらはSideWidgetBaseコンポーネントというベースとなるコンポーネントを作成し、
各ウィジェットごとに中身を渡すことで実装しました。
▲サイドバーウィジェットのベースコンポーネント
▲お知らせウィジェットの実装例

エレキベア
ベースコンポーネントを用意しておけば実装しやすそうクマね

マイケル
上記のような形で各ウィジェットも移行し、最終的には下記のような形となりました。
▲サイドバーの設定

エレキベア
盛りだくさんクマが綺麗に整理できたクマね
カテゴリや検索ワードによる絞り込み

マイケル
次にカテゴリや検索ワードによる記事カードの絞り込みについてです。
こちらはSEOからページを除外して問題ない & SPAで実装したかったため、クエリパラメータで指定された場合にフィルタする方針にしました。

▲カテゴリによる絞り込み (/?category=[XXX])

▲検索ワードによる絞り込み (/?search=[XXX])

エレキベア
あくまで記事一覧ページ内で制御するクマね

マイケル
SPAでの実装となるため、下記のように高速な遷移処理を実現できます。

▲SPAのため表示の切替が高速

エレキベア
これは気持ちいいクマ〜〜〜〜

マイケル
実装は下記のようになっています。
クエリパラメータから取得した値から表示する記事カードをフィルタする処理を挟んでいます。
▲表示する記事カードをフィルタする

マイケル
一例にはなりますが、検索ウィジェットで検索を行った場合の処理は下記のようになっています。
検索ウィジェットの実装

エレキベア
useRouterを使用してクエリパラメータを指定しているクマね
ペジネーション

マイケル
ペジネーションについても基本は同じような実装になっています。
記事カードの数、ページ数によって表示するページ数を切り替えて、ページ変更した場合にはクエリパラメータに指定するよう実装しています。

▲ペジネーションにより表示する記事を切り替える

▲こちらもSPAのため遷移が高速
▲ペジネーションの実装

エレキベア
記事の内容に関連しないものはクエリパラメータで完結させたクマね
記事内の外部スクリプト読込

マイケル
最後に、記事内で使用していたPrism.js等の外部スクリプト読込についてです。
Mathjaxによる数式表示やCodepen等は別途外部スクリプトをimportしておく必要があります。

▲数式表示やCodepen等は外部スクリプトのimportが必要

マイケル
ここが意外とハマりポイントで、読み込むタイミングによって記事が表示されなかったりエラーが発生したりなど最適解が中々見つかりませんでした・・・。

エレキベア
こればっかりは外部に依存しているクマからね・・・

マイケル
いろいろ試した結果、下記のような形でuseEffect内でscriptタグをimportしなおす対応を入れることで正常に表示できるようになりました。
next/script で実装できると綺麗だったのですが、仕方ないですね・・・
▲useEffect内でscriptを再importする
▲scriptタグの追加・削除処理

マイケル
importするscriptについては、別途Settingsクラス内に定義するようにしておきました。
今回追加したものは下記になります。
importするscriptの設定

エレキベア
他にいい方法があれば教えてほしいクマ〜〜〜
未実装の機能

マイケル
WordPressのデータ移行に関する紹介は以上になります。
大体の機能は移行できたと思うのですが、下記についてはまだ未実装です。
- コメント機能
- 広告機能
- SNS機能

マイケル
この辺りは公開後にぼちぼち対応していく予定です。
コメント機能はサーバが必要になりそうなのでどうするか悩みどころですね・・・

エレキベア
これを機にAPIサーバを一つ立てて持っておくのもいいかもしれないクマね
おわりに

マイケル
というわけで今回はWordPressのデータ移行についてでした!
どうだったかな??

エレキベア
既存ブログをどうNext.jsに持っていくかは悩みどころクマがなんとかなりそうでよかったクマ
やっぱりパフォーマンスがいいと気持ちいいクマね

マイケル
次回は今後の執筆環境の改善を目指して、Markdownによる執筆環境構築について紹介します。
お楽しみに!!

エレキベア
クマ〜〜〜〜〜
【Next.js】第二回 WordPressブログをNext.jsに移行する 〜WordPressデータの移行・表示編〜 〜完〜

【都会のエレキベア】ブログを大幅リニューアル!WordPressからNext.jsに移行するまでの流れをまとめる
2024-01-01

【Next.js】第一回 WordPressブログをNext.jsに移行する 〜全体設計、環境構築編〜
2023-12-31

【Next.js】第二回 WordPressブログをNext.jsに移行する 〜WordPressデータの移行・表示編〜
2023-12-31

【Next.js】第三回 WordPressブログをNext.jsに移行する 〜Markdown執筆環境構築編〜
2023-12-31

【Next.js】第四回 WordPressブログをNext.jsに移行する 〜サーバ移行・SEO・広告設定編〜
2023-12-31