EmDash は WordPress からの完全な移行パスを提供します。CLI なしで管理ダッシュボードから投稿・固定ページ・メディア・タクソノミーをインポートできます。
始める前に
コンテンツをエクスポート
WordPress で ツール → エクスポート から完全なエクスポートファイル(.xml)をダウンロードします。
サイトをバックアップ
移行が成功したと確認するまで、WordPress サイトは稼働させたままにします。
インポート方法
EmDash は WordPress コンテンツのインポートに 3 つの方法をサポートします。
| 方法 | 向いている用途 | 下書きを含む | 認証が必要 |
|---|---|---|---|
| WXR ファイルアップロード | 完全移行 | はい | いいえ |
| WordPress.com | WordPress.com 上のサイト | はい | OAuth |
| REST API(プローブ) | エクスポート前の内容確認 | いいえ | 任意 |
ほとんどの移行では WXR ファイルのアップロードを推奨します。下書き・カスタムフィールド・非公開投稿を含むすべてのコンテンツを取り込めます。
WXR ファイルのインポート
-
WordPress からエクスポート
WordPress 管理画面で ツール → エクスポート → すべてのコンテンツ → エクスポートファイルをダウンロード。
-
インポートウィザードを開く
EmDash で 管理 → 設定 → インポート → WordPress。
-
エクスポートファイルをアップロード
.xmlをドラッグ&ドロップするか参照します。ブラウザ内で解析されます。 -
検出された内容を確認
ウィザードに検出結果が表示されます:
Found in export: ├── Posts: 127 → posts [New collection] ├── Pages: 12 → pages [Add fields] └── Media: 89 attachments -
マッピングを設定
インポートする投稿タイプを切り替えます。EmDash は自動的に:
- 未マップの投稿タイプ用に新しいコレクションを作成
- 既存コレクションに不足フィールドを追加
- フィールド型の競合を警告
-
インポートを実行
コンテンツをインポート をクリック。各アイテムの処理状況が表示されます。
-
メディアのインポート(任意)
コンテンツの後に、メディアファイルをダウンロードするか選択します。EmDash は:
- WordPress の URL からダウンロード
- コンテンツハッシュで重複排除
- コンテンツ内の URL を自動で書き換え
コンテンツの変換
Gutenberg から Portable Text へ
EmDash は Gutenberg ブロックを Portable Text に変換します。
| Gutenberg ブロック | Portable Text | メモ |
|---|---|---|
core/paragraph | block style=“normal” | インラインマークを保持 |
core/heading | block style=“h1-h6” | レベルはブロック属性から |
core/image | image ブロック | メディア参照を更新 |
core/list | listItem 型の block | 番号付き・番号なし |
core/quote | block style=“blockquote” | 引用情報を含む |
core/code | code ブロック | 言語属性を保持 |
core/embed | embed ブロック | URL とプロバイダーを保存 |
core/gallery | gallery ブロック | 画像参照の配列 |
core/columns | columns ブロック | ネストした内容を保持 |
| 不明なブロック | htmlBlock | レビュー用に生 HTML を保持 |
不明なブロックは元の HTML とブロックメタデータ付きで htmlBlock として保存されます。手動で変換するか、カスタム Portable Text コンポーネントで描画できます。
クラシックエディターの内容
クラシックエディターの HTML は Portable Text ブロックに変換されます。インラインスタイル(<strong>、<em>、<a>)は span 上のマークになります。
ステータスの対応
| WordPress ステータス | EmDash ステータス |
|---|---|
publish | published |
draft | draft |
pending | pending |
private | private |
future | scheduled |
trash | archived |
タクソノミーのインポート
カテゴリーとタグは階層を保ったままタクソノミーとしてインポートされます:
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 フィールドはインポート時に分析されます:
-
分析フェーズ
ウィザードがカスタムフィールドを検出し、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) -
フィールドマッピング
_edit_、_wp_で始まる内部フィールドはデフォルトで非表示。SEO プラグインのフィールドはseoオブジェクトにマップされます。 -
型の推論
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の Astroredirectsオプション
概念対応表
WordPress のパターンを EmDash に合わせるときの参考です。
| WordPress | EmDash | メモ |
|---|---|---|
register_post_type() | 管理 UI のコレクション | ダッシュボードまたは API で作成 |
register_taxonomy() | タクソノミーまたは配列フィールド | 複雑さによる |
register_meta() | コレクションスキーマのフィールド | 型付き、キー値ではない |
WP_Query | getCollection(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_options | ctx.kv | キー値ストア |
wp_postmeta | コレクションフィールド | 構造化 |
$wpdb | ctx.storage | 直接ストレージアクセス |
| カテゴリー/タグ | タクソノミー | 階層を保持 |
API インポート(上級)
WordPress インポートは管理ダッシュボードと REST API の両方から利用できます。フィールドマッピング・競合解決・進捗表示にはウィザードを推奨します。
プログラムからは /_emdash/api/import/wordpress/ 配下のエンドポイントを使用します。
トラブルシューティング
「XML parsing error」
エクスポートファイルが破損または不完全な可能性があります。WordPress から再エクスポートしてください。
メディアのダウンロード失敗
認証が必要な画像や URL が変わった画像がある場合があります。インポートは続行され、失敗した URL はログに残ります。
フィールド型の競合
既存コレクションに互換性のない型のフィールドがあると、ウィザードが競合を表示します。次のいずれかで対処:
- EmDash のフィールド名を変更
- WordPress 側のマッピングを変更
- コレクションを削除して再作成
大きなエクスポート
100MB を超える場合:
- WordPress で投稿タイプごとに分割エクスポート
- ファイルを順番にインポート
- 信頼性のため CLI の
--resumeを使用
次のステップ
- Content Import — その他のインポート元と方法
- Plugin Porting — WordPress プラグイン機能の移行
- Working with Content — インポートしたコンテンツの取得と表示