WordPressから移行する
WordPressで運用しているサイトを、ShareDan CMS+自前フロントエンドのヘッドレス構成へ移行する進め方をまとめます。コンテンツの移し替えはShareDanが運営代行する移行サービスとして提供し、開発者は配信フロントの実装とURL・リダイレクト設計に集中できます。本ガイドでは、自動で取り込まれる範囲・お預かりするデータ・移行後の連携までを解説します。
1. 移行の全体像(運営が代行)
モノリシックなWordPress(管理画面もテーマも同じサーバーで動く構成)は、更新のたびにサーバー全体へ負荷がかかり、プラグインの脆弱性がそのまま公開面のリスクになります。ShareDan CMSへの移行では、コンテンツ管理(CMS)と配信(自前フロント)を分離し、次の3点を狙います。
- 速度:配信はSSG/ISRで静的化されたページになり、WordPressの実行環境を経由しない。
- 保守:テーマ・プラグインの更新対応が不要になり、フロントはコード管理下に置ける。
- セキュリティ:管理画面(wp-admin)が公開面から切り離され、攻撃対象領域が減る。
コンテンツの取り込みは、運営が専用ツールで一括処理します。.sqlのDBダンプを直接解析し、本文HTMLをエディタ(ProseMirror)形式へ変換、画像はファイル機能へ再ホストします。手作業で1件ずつ貼り付ける必要はありません。本番反映の前にdry-run(試行)で対象件数・変換警告を確認してから本実行するため、取りこぼしや意図しない変換を事前に把握できます。
全部を一度に切り替える必要もありません。WordPressを残したまま新フロントを別ドメイン/パスで先行公開し、コンテンツ種別ごと(お知らせ→FAQ→固定ページ…)に確認しながら、最後にDNSとリダイレクトを切り替える進め方が安全です。
2. 自動で取り込まれるもの
WordPressの投稿タイプ・分類・メディア・フォームは、CMSの概念へ次のように自動でマッピングされます。取り込み前のdry-runで、各投稿種別の件数とマッピング先を確認できます。
移行しないもの(ヘッドレス化に伴い対象外)
移行するのはコンテンツで、サイトの見た目(デザイン)は移行対象ではありません。次の要素は取り込まれないため、配信フロント側で実装します。
- テーマ・テンプレート・ウィジェット・ナビゲーションメニュー・サイドバー等の見た目/レイアウト
- コメント・トラックバック、プラグイン、ACF等のカスタムフィールド
- リダイレクト設定・ユーザーアカウント
3. お預かりするデータ
運営代行では、次の2つをご用意いただきます。取り込み後の管理画面での修正は不要になるよう、可能な範囲で揃った状態でのお預かりが理想です。
- WordPressのDBダンプ:
.sql(または.sql.gz)。phpMyAdmin・mysqldumpいずれのエクスポートでも可。テーブル接頭辞は自動検出するためwp_以外でも問題ありません。 -
wp-content/uploadsのzip:画像等のメディア。これを基に再ホスト(WebP変換・サムネイル生成)します。省略した場合は本文中の画像URLからの取得にフォールバックしますが、旧サイトが稼働中のときのみ有効です。
取り込みはdry-run(試行)→本実行の2段階で進めます。処理は冪等なので、内容を調整して再実行しても重複しません。移行先は既存サイトを上書きせず、必ず新しいサイトとして作成するため、既存の公開サイトに影響を与えずに検証できます。
4. URL・リダイレクト設計
旧URLへのアクセス(外部リンク・検索エンジンのインデックス・ブックマーク)を失わないために、301(恒久)リダイレクトを設計します。リダイレクト設定はWordPressから移行されないため、配信フロント側で用意します。まずは代表的なWordPressのURLパターンと移行後URLの対応表を作りましょう。
- 記事ID型:
/?p=123→/news/{slug} - 年月パーマリンク:
/2024/05/slug/→/news/slug - カテゴリアーカイブ:
/category/notice/→/news?category=notice
対応表さえ作れれば、実装は配信環境に合わせて選べます。
# WordPress の record ID URL
/?p=123 /news/launch-event 301
# 年月付きパーマリンク(スラッグは維持)
/2024/05/legacy-slug/ /news/legacy-slug 301
# カテゴリアーカイブ
/category/notice/ /news?category=notice 301 # 記事ID型 → 新URL(1件ずつ書き出す)
rewrite ^/\?p=123$ /news/launch-event permanent;
# 年月パーマリンク → スラッグ維持のまま新URLへ
rewrite ^/\d{4}/\d{2}/([^/]+)/?$ /news/$1 permanent;
# カテゴリアーカイブ → カテゴリ別一覧
rewrite ^/category/([^/]+)/?$ /news?category=$1 permanent; 5. 移行後のフロント連携
取り込みが完了すると、WordPressの投稿はそのまま公開APIから配信できます。あとはAstroで作るやNext.jsで作ると同じ要領で、種別ごとに一覧・詳細を組むだけです。本文はProseMirror
JSONで返るため、SDKの renderProseMirror() でHTML化します。
import { ShareDanCmsClient } from '@sharedan/cms-sdk';
import { renderProseMirror } from '@sharedan/cms-sdk';
const cms = new ShareDanCmsClient({
baseUrl: 'https://api.cms.sharedan.co.jp',
apiKey: import.meta.env.CMS_API_KEY, // サーバー側だけで参照
siteCode: 'main',
});
// 移行後は WordPress の投稿がそのまま種別 'news' の投稿として並ぶ
const { items } = await cms.posts.list('news', { perPage: 100 });
// 詳細は本文(ProseMirror JSON)を renderProseMirror でHTML化
const post = await cms.posts.get('news', 'launch-event');
const html = renderProseMirror(post.body);
Contact Form 7 から移行したフォームは、cms.forms.get('contact')で定義を取得してUIを描画し、cms.forms.submit('contact', values)で送信します。スパム対策(Turnstile・レート制限・ハニーポット・送信速度チェック・重複送信防止)はフォームごとに標準搭載なので、reCAPTCHA相当を個別に組む必要はありません。詳しくは問い合わせフォーム連携を参照してください。
new.example.com)で先行公開し、コンテンツごとに動作確認しておくと、切替当日はDNSとリダイレクトの反映だけで済みます。
このページはお役に立ちましたか?
改善要望・不具合・ドキュメントの分かりにくい点など、お気軽にお寄せください。いただいた内容は今後の改善に役立てます。
お寄せいただきありがとうございます。今後の改善に役立てます。