WordPress からの移行

このページ

EmDash は WordPress からの完全な移行パスを提供します。CLI なしで管理ダッシュボードから投稿・固定ページ・メディア・タクソノミーをインポートできます。

始める前に

コンテンツをエクスポート

WordPress で ツール → エクスポート から完全なエクスポートファイル(.xml)をダウンロードします。

サイトをバックアップ

移行が成功したと確認するまで、WordPress サイトは稼働させたままにします。

インポート方法

EmDash は WordPress コンテンツのインポートに 3 つの方法をサポートします。

方法向いている用途下書きを含む認証が必要
WXR ファイルアップロード完全移行はいいいえ
WordPress.comWordPress.com 上のサイトはいOAuth
REST API(プローブ)エクスポート前の内容確認いいえ任意

ほとんどの移行では WXR ファイルのアップロードを推奨します。下書き・カスタムフィールド・非公開投稿を含むすべてのコンテンツを取り込めます。

WXR ファイルのインポート

  1. WordPress からエクスポート

    WordPress 管理画面で ツール → エクスポート → すべてのコンテンツ → エクスポートファイルをダウンロード

  2. インポートウィザードを開く

    EmDash で 管理 → 設定 → インポート → WordPress

  3. エクスポートファイルをアップロード

    .xml をドラッグ&ドロップするか参照します。ブラウザ内で解析されます。

  4. 検出された内容を確認

    ウィザードに検出結果が表示されます:

    Found in export:
    ├── Posts: 127 → posts [New collection]
    ├── Pages: 12  → pages [Add fields]
    └── Media: 89 attachments
  5. マッピングを設定

    インポートする投稿タイプを切り替えます。EmDash は自動的に:

    • 未マップの投稿タイプ用に新しいコレクションを作成
    • 既存コレクションに不足フィールドを追加
    • フィールド型の競合を警告
  6. インポートを実行

    コンテンツをインポート をクリック。各アイテムの処理状況が表示されます。

  7. メディアのインポート(任意)

    コンテンツの後に、メディアファイルをダウンロードするか選択します。EmDash は:

    • WordPress の URL からダウンロード
    • コンテンツハッシュで重複排除
    • コンテンツ内の URL を自動で書き換え

コンテンツの変換

Gutenberg から Portable Text へ

EmDash は Gutenberg ブロックを Portable Text に変換します。

Gutenberg ブロックPortable Textメモ
core/paragraphblock style=“normal”インラインマークを保持
core/headingblock style=“h1-h6”レベルはブロック属性から
core/imageimage ブロックメディア参照を更新
core/listlistItem 型の block番号付き・番号なし
core/quoteblock style=“blockquote”引用情報を含む
core/codecode ブロック言語属性を保持
core/embedembed ブロックURL とプロバイダーを保存
core/gallerygallery ブロック画像参照の配列
core/columnscolumns ブロックネストした内容を保持
不明なブロックhtmlBlockレビュー用に生 HTML を保持

不明なブロックは元の HTML とブロックメタデータ付きで htmlBlock として保存されます。手動で変換するか、カスタム Portable Text コンポーネントで描画できます。

クラシックエディターの内容

クラシックエディターの HTML は Portable Text ブロックに変換されます。インラインスタイル(<strong><em><a>)は span 上のマークになります。

ステータスの対応

WordPress ステータスEmDash ステータス
publishpublished
draftdraft
pendingpending
privateprivate
futurescheduled
trasharchived

タクソノミーのインポート

カテゴリーとタグは階層を保ったままタクソノミーとしてインポートされます:

WordPress:                    EmDash:
├── Categories (hierarchical) ├── taxonomies table
│   ├── News                  │   ├── category/news
│   │   ├── Local             │   ├── category/local (parent: news)
│   │   └── World             │   ├── category/world (parent: news)
│   └── Sports                │   └── category/sports
└── Tags (flat)               └── content_taxonomies junction
    ├── featured                  ├── tag/featured
    └── breaking                  └── tag/breaking

カスタムフィールドと ACF

投稿メタと ACF フィールドはインポート時に分析されます:

  1. 分析フェーズ

    ウィザードがカスタムフィールドを検出し、EmDash のフィールド型を提案します:

    Custom Fields:
    ├── subtitle (string, 45 posts)
    ├── _yoast_wpseo_title → seo.title (string, 127 posts)
    ├── _thumbnail_id → featuredImage (reference, 89 posts)
    └── price (number, 23 posts)
  2. フィールドマッピング

    _edit__wp_ で始まる内部フィールドはデフォルトで非表示。SEO プラグインのフィールドは seo オブジェクトにマップされます。

  3. 型の推論

    EmDash は値から型を推論します:

    • 数値文字列 → number
    • "1""0""true""false"boolean
    • ISO 日付 → date
    • シリアライズされた PHP/JSON → json
    • WordPress ID(例:_thumbnail_id) → reference

URL リダイレクト

インポート後、EmDash はリダイレクトマップを生成します:

{
	"redirects": [
		{ "from": "/?p=123", "to": "/posts/hello-world" },
		{ "from": "/2024/01/hello-world/", "to": "/posts/hello-world" },
		{ "from": "/category/news/", "to": "/categories/news" }
	],
	"feeds": [
		{ "from": "/feed/", "to": "/rss.xml" },
		{ "from": "/feed/atom/", "to": "/atom.xml" }
	]
}

次に適用できます:

  • Cloudflare のリダイレクトルール
  • ホスティングのリダイレクト設定
  • astro.config.mjs の Astro redirects オプション

概念対応表

WordPress のパターンを EmDash に合わせるときの参考です。

WordPressEmDashメモ
register_post_type()管理 UI のコレクションダッシュボードまたは API で作成
register_taxonomy()タクソノミーまたは配列フィールド複雑さによる
register_meta()コレクションスキーマのフィールド型付き、キー値ではない
WP_QuerygetCollection(filters)ランタイムクエリ
get_post()getEntry(collection, id)エントリまたは null
wp_insert_post()POST /_emdash/api/content/{type}REST API
the_content<PortableText value={...} />Portable Text の描画
add_shortcode()Portable Text カスタムブロックカスタムレンダラー
register_block_type()Portable Text カスタムブロックショートコードと同様
add_menu_page()プラグイン管理ページ/_emdash/admin/ 配下
add_action/filter()プラグインフックhooks.content:beforeSave など
wp_optionsctx.kvキー値ストア
wp_postmetaコレクションフィールド構造化
$wpdbctx.storage直接ストレージアクセス
カテゴリー/タグタクソノミー階層を保持

API インポート(上級)

WordPress インポートは管理ダッシュボードと REST API の両方から利用できます。フィールドマッピング・競合解決・進捗表示にはウィザードを推奨します。

プログラムからは /_emdash/api/import/wordpress/ 配下のエンドポイントを使用します。

トラブルシューティング

「XML parsing error」

エクスポートファイルが破損または不完全な可能性があります。WordPress から再エクスポートしてください。

メディアのダウンロード失敗

認証が必要な画像や URL が変わった画像がある場合があります。インポートは続行され、失敗した URL はログに残ります。

フィールド型の競合

既存コレクションに互換性のない型のフィールドがあると、ウィザードが競合を表示します。次のいずれかで対処:

  • EmDash のフィールド名を変更
  • WordPress 側のマッピングを変更
  • コレクションを削除して再作成

大きなエクスポート

100MB を超える場合:

  1. WordPress で投稿タイプごとに分割エクスポート
  2. ファイルを順番にインポート
  3. 信頼性のため CLI の --resume を使用

次のステップ