WordPressからヘッドレスCMS+静的サイトへ移行する手順。記事・画像・URLの移し方、301リダイレクト、フォーム、検索順位を落とさないための確認チェックリスト
WordPressから
この
この
移行の手順は7段に分け、段ごとに「終わった」と言える条件を決める
WordPressから
| 段 | やること | 終わったと |
|---|---|---|
| 1 | 旧URL・画像・フォームの |
URLと |
| 2 | CMSの |
全記事が |
| 3 | 表の |
ビルド結果に、 |
| 4 | URLが |
変わる |
| 5 | フォームを |
送信から、 |
| 6 | 一覧と |
照合の |
| 7 | 公開と、 |
404の |
以下、
1段目:旧サイトのURLと画像は、WordPressのREST APIから書き出して一覧にする
移す対象のlink(ページのsource_url(画像の
import fs from 'node:fs/promises';
// WordPress の REST API は1回に最大100件まで。全体のページ数は X-WP-TotalPages の見出しで返る
const BASE = 'https://example.co.jp/wp-json/wp/v2';
async function fetchAll(type) {
const items = [];
let total = 1;
for (let page = 1; page <= total; page++) {
const res = await fetch(`${BASE}/${type}?per_page=100&page=${page}&_embed`);
if (!res.ok) throw new Error(`${type} ${page}: ${res.status}`);
total = Number(res.headers.get('X-WP-TotalPages') ?? 1);
items.push(...(await res.json()));
}
return items;
}
for (const type of ['posts', 'pages', 'categories', 'tags', 'media']) {
await fs.writeFile(`export/${type}.json`, JSON.stringify(await fetchAll(type)));
}APIに
- 一覧ページの
2ページ目以降の URL。 記事の 数と 1ページの 件数から 計算する - Search Console
(ページの インデックス登録の レポート)や、 アクセス解析で 見られている URL。 外から リンクされている 古い URLが 見つかる ことがある - 旧サイトが
出していた サイトマップ。 WordPress標準の ものか、 SEOの プラグインの ものかで 名前が 違う
この
2段目:CMSの入力欄を先に決め、本文のHTMLを整えてから取り込む
ヘッドレスCMSへの
取り込みの
| 本文に |
起きること | 片付け方 |
|---|---|---|
ショートコード[gallery] など) |
静的サイトでは |
取り込む前に |
| プラグインが |
クラス名だけが |
不要な |
| 本文の |
旧ドメインや |
3段目で |
| 記事どうしの |
絶対URLだと、 |
ルートからの |
| 独自の |
REST APIに |
出すための |
取り込みは、
3段目:表のサイトは、旧サイトと同じURLの形で書き出す
URLを/slug/index.html)に
画像の
| 選び方 | 良い所 | 注意する |
|---|---|---|
| 旧サイトの |
画像の |
移行後に |
| 画像も |
画像の |
画像の |
この
公開の
4段目:301リダイレクトは、パスの変更とホスト名の統一で置き場所を分ける
URLが
この
| 転送の種類 | 置いた場所 | この |
|---|---|---|
| ホスト名の |
Pagesの |
apex |
| カテゴリーの |
Pagesの_redirects(転送の |
名前を |
| 旧サイトマップ | 同じ |
WordPress標準の |
| 無くなった |
同じ |
中身の |
旧サイトマップのrobots.txt に
転送を
- Pagesの
転送の 設定ファイルは、 静的な 転送が 2,000件、 動的な 転送 ( *や:placeholderを使う もの)が 100件までで、 クエリ文字列での 振り分けは できません。 件数が 多い 場合は、 関数 (Functions)か、 ダッシュボードで 作る 一括の 転送の ルールに 分けます - 無くなった
ページを まとめて トップページへ 転送すると、 Googleには 「見つからない ページ」と 同じ 扱い (ソフト404)に される ことがあります。 転送先は 中身の 近い ページにします - 転送は、
Googleの 案内では 少なくとも 1年、 できるだけ長く 残します
5段目:フォームは静的サイトでは動かないので、作り直して両方の受信まで確かめる
WordPressの
作り直す
| 確かめる |
方法 |
|---|---|
| スマホで |
実機で、 |
| 顧客への |
実際に |
| 送信元の |
送信に |
| いたずらの |
人の |
| 送信の |
完了の |
| 旧フォームの |
旧サイトで |
フォームは
6段目:ビルドのたびに、旧URLと画像の一覧を書き出し結果と照合する
公開の
この
ヘッドレスCMSを
7段目:公開した日と翌週以降に、検索の状況を確かめる
公開の
公開の
- 旧URLの
一覧から 代表的な ものを curl -Iで開き、 200か 301に なる こと。 www なしの URLが www 付きの 同じ パスへ 1回で 転送される こと - 開発中に
入れていた noindexや、robots.txtでのクロールの 拒否が 残っていない こと - 新しい
サイトマップを 送信し、 読み込みが 成功と 表示されるのを 見る - IndexNowで、
Bingなど IndexNowに 参加している 検索エンジンに 新しい URLを 知らせる こと (この ブログでは、 鍵の ファイルを サイトに 置き、 サイトマップに 載った 全URLを まとめて 送れるようにしました) - フォームから
実際に 1件送り、 両方の メールが 届く こと
翌週以降に
- インデックス登録の
レポートで、 404や 転送の エラーの 件数が 増えていないか - 表示回数と
クリック数が、 移行の 前と 比べて 大きく 落ちていないか - CMSで
公開した 記事が、 表の サイトに 反映されているか (Webhookと デプロイフックの 配線)
移行の進み具合を確かめるチェックリスト
発注する
| 時期 | 項目 | 確かめた |
|---|---|---|
| 作り |
旧URLと |
REST APIと |
| 作り |
変えない |
URLの |
| 作っている |
CMSの |
件数の比較 |
| 作っている |
本文に |
文字列の |
| 公開の前 | 旧URLと |
照合の |
| 公開の前 | フォームから |
実際の送信 |
| 公開の前 | 公開の |
テスト用の |
| 公開の当日 | ホスト名の |
curl -I の結果 |
| 公開の当日 | サイトマップの |
送信の結果 |
| 公開の |
404と |
インデックス登録の |
株式会社bundlyzeでは
手順の裏付けに使った資料(2026年10月3日時点)
| 内容 | 出典 |
|---|---|
| URLを |
Google 検索セントラル https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes |
| 301・308・302の |
Google 検索セントラル https://developers.google.com/search/docs/crawling-indexing/301-redirects |
| REST APIの |
WordPress REST API Handbook https://developer.wordpress.org/rest-api/using-the-rest-api/pagination/ |
| 転送の |
Cloudflare Docs https://developers.cloudflare.com/pages/configuration/redirects/ |
| CMSの |
Cloudflare Docs https://developers.cloudflare.com/pages/configuration/deploy-hooks/ |
| CMSから |
microCMS https://document.microcms.io/manual/webhook-setting |
| 新しい |
IndexNow https://www.indexnow.org/documentation |
よくある質問
WordPressの記事のURLは、ヘッドレスCMSに移したあとも同じにできますか?
できます。
301リダイレクトは、移行したあとどのくらいの期間残しておけばよいですか?
Googleは、
WordPressのお問い合わせフォームは、静的サイトでもそのまま使えますか?
WordPressの