EmDash は、/_emdash/admin/import/wordpress にある Import from WordPress ページを通じて WordPress のコンテンツをインポートします。インポーターは、WordPress eXtended RSS (WXR) ファイルを分析することも、EmDash Exporter プラグインを実行しているサイトに接続することもできます。
インポートソース
ソースレジストリには、3 つの WordPress ソースが登録されています。
| ソース ID | 入力 | コンテンツのインポート | アクセス |
|---|---|---|---|
wxr | WordPress のエクスポート .xml ファイル | 可 | エクスポートに含まれるデータ |
wordpress-plugin | サイト URL と EmDash Exporter の認証情報 | 可 | Exporter のエンドポイント(認証が必要なコンテンツを含む) |
wordpress-rest | 公開サイトの URL | 不可 | 確認と公開されている件数のみ |
OAuth によるインポートソース wordpress-com はありません。WordPress.com のサイトでは、WXR エクスポートか、互換性のある EmDash Exporter 接続を使用する必要があります。
WXR ファイルをインポートする
WordPress で必要なコンテンツをエクスポートでき、EmDash Exporter をインストールできない場合は WXR を使用します。
-
WordPress で Tools → Export を開き、必要なコンテンツを選択して、XML ファイルをダウンロードします。
-
EmDash の管理画面のサイドバーで Import を選択し、ファイルをアップロードします。
-
スキーマやコンテンツを作成する前に、検出された投稿タイプ、フィールド、著者、タクソノミー、再利用ブロック、添付ファイルの URL を確認します。
XML には、添付ファイルのメタデータとソースの URL が含まれており、メディアのバイトデータは含まれません。任意のメディアのコピーが完了するまで、WordPress に到達できる状態を保ってください。
EmDash Exporter に接続する
WordPress サイトを管理していて、下書きや対応している設定など、認証が必要なデータが必要な場合は Exporter を使用します。コメント、メニュー、ロゴ、ファビコン、およびマイグレーションキーを生成する Tools → EmDash Migration ページには、Exporter 1.2.0 以降が必要です。どのバージョンの Exporter でも、WordPress のユーザー名とアプリケーションパスワードで接続できます。Exporter は emdash/v1 の API エンドポイントを通じてデータを送信します。EmDash にデータベースへの直接アクセスを与えるものではありません。
管理画面のインポートフロー
管理画面では、次の段階を実行します。
- 接続。 WXR ファイルをアップロードするか、EmDash Exporter のマイグレーションキーを貼り付けるか、サイト URL を入力します。
- 分析。 投稿タイプ、必須フィールド、著者、添付ファイル、スキーマの互換性を読み取ります。
- 確認。 投稿タイプ、コレクションの対応付け、著者、対応している追加項目を選択します。
- 準備。 不足しているコレクションとフィールドを作成します。型に互換性のない既存フィールドがある場合、その対応付けはブロックされます。
- インポート。 コンテンツを変換して作成します。Exporter の経路では、コンテンツ、コメント、最終処理のそれぞれにサイズが制限されたリクエストを使用します。
- メディアのコピー。 選択した WXR の添付ファイルを EmDash のストレージにダウンロードし、一致する URL を書き換えます。
WXR の経路では、投稿、固定ページ、カスタム投稿タイプ、タクソノミー、再利用ブロック、著者またはゲストの byline、エクスポートに記載されたメディアをインポートできます。Exporter の経路では、これらに加えて、稼働中の WordPress API から選択したサイト設定と対応している SEO の値を取得でき、Exporter 1.2.0 以降ではコメント、メニュー、ロゴ、ファビコンも取得できます。
分析結果を理解する
検出された投稿タイプごとに、確認画面には推奨されるコレクションと、次の 4 つのスキーマ状態のいずれかが表示されます。
| 状態 | 意味 |
|---|---|
| Ready | コレクションと必須フィールドの型がすでに互換性を持っている |
| New collection | 準備ステップでコレクションと必須フィールドが作成される |
| Add fields | コレクションは存在し、準備ステップで不足しているフィールドが追加される |
| Incompatible | 既存のフィールドの型が異なる。その投稿タイプをインポートする前に、対応付けまたはスキーマを修正する |
準備ステップは追加のみを行います。インポートに合わせて既存フィールドの型を変更することはありません。
ステータスの対応付け
コンテンツのルートは、WordPress のインポートから 2 つのステータスを保存します。
| WordPress のステータス | EmDash のステータス |
|---|---|
publish | published |
draft | draft |
pending | draft |
private | draft |
future、trash、またはその他の値 | draft |
インポーターは、WordPress の保留中、非公開、予約済み、ゴミ箱の意味を保持しません。EmDash で公開する前に、それらのエントリーを確認してください。
コンテンツと識別子
WXR と Exporter のソースは、Gutenberg のマークアップを Portable Text に変換します。post は posts に、page は pages に、既知のカスタム投稿タイプはコレクションの slug に対応付けられます。WordPress の内部投稿タイプは除外されます。再利用ブロック(wp_block)は、通常のエントリーではなく EmDash のセクションとして扱われます。
インポートされたエントリーについて:
- WordPress の投稿 slug は、利用可能な場合に EmDash の slug になります。
- EmDash は独自のデータベース ID を生成します。
- 著者の対応付けにより、EmDash のユーザーが関連付けられます。対応付けされていない WordPress の著者は、再利用可能なゲストの byline になることがあります。
- WordPress の ID は、メニュー、コメント、アイキャッチ画像、翻訳などのリレーションを解決するために一時的に使用されます。既存の WXR エントリーを検出するための永続的な識別情報ではありません。
skipExisting を指定した WXR の再実行では、コレクション、slug、ロケールで既存のエントリーを照合します。そのため、slug が変更されると別のエントリーが作成される場合があります。Exporter の経路でも同じ slug とロケールのチェックを使用し、スキップしたエントリーから WordPress ID のリレーションマップを再構築します。
メディアのコピーと重複排除
メディアの段階では、各添付ファイルの URL をダウンロードし、ダウンロードしたバイトデータの SHA-1 ハッシュを計算して、そのコンテンツハッシュを持つ既存のメディア行を探します。WordPress の URL が異なっていても、バイトデータが同一であれば既存のメディアレコードが再利用されます。
ハッシュは sha1: プレフィックス付きで保存されます。これは重複排除のキーであり、セキュリティ署名ではありません。ファイル名が一致するだけでは、2 つの URL は重複とは見なされません。
メディアをコピーした後、インポーターは、Portable Text、テキスト、文字列、画像、ファイルの各フィールド内の一致する URL を書き換えます。ダウンロードと書き換えられたページを検証するまで、WordPress のオリジンをオンラインのまま維持してください。
再試行の動作
管理画面は、WXR インポートの永続的な再開トークンを保存しません。リクエストが失敗した場合:
- skip existing を有効にして、分析とインポートを再実行します。
- 既存のエントリーは、コレクション、slug、ロケールによってスキップされます。
- すでに保存されているファイルについては、メディアの再実行は安全です。バイト単位で同一のダウンロードは、コンテンツハッシュを再利用するためです。
- 再試行する前に、部分的なスキーマの変更と、slug が変更されたエントリーを確認します。
Exporter のフローは、Worker の制限に収まるようにチャンクに分割されています。ブラウザーは、リクエストの間でカーソルと WordPress から EmDash へのリレーションマップを保持します。ブラウザーがその状態を失った場合は、インポートを再起動してください。スキップされたエントリーが、コンテンツのページを処理する過程でリレーションマップを再構築します。
別の CLI である emdash import wordpress は、変換した JSON ファイルを出力ディレクトリに書き込みます。その --resume オプションは .wp-migration-progress.json を読み取り、そこにすでに記録されている WordPress の投稿 ID と添付ファイル ID をスキップします。このファイル変換のワークフローは、管理画面のデータベースインポートではなく、管理画面のリクエストを再開可能にするものでもありません。
管理 API の仕様
これらのエンドポイントは、認証が必要な管理画面のページを動かしています。import:execute を持つ管理者セッションと、X-EmDash-Request: 1 ヘッダーが必要です。成功レスポンスは通常 { "success": true, "data": ... } というエンベロープを使用し、エラーは { "success": false, "error": { "code", "message" } } を使用します。
URL を確認する
POST /_emdash/api/import/probe は、JSON { "url": "https://example.com" } を受け取ります。
その data の値は { success: true, result } です。result には url、isWordPress、bestMatch、allMatches が含まれます。WordPress REST の単純な一致では WXR のアップロードが推奨されます。REST による直接インポートが有効になるわけではありません。
WXR ファイルを分析する
POST /_emdash/api/import/wordpress/analyze は、file パートを含む multipart/form-data を受け取ります。その data の値には、サイト、投稿タイプの分析、添付ファイルの概要、著者の概要、タクソノミーの件数、カスタムフィールドの提案が含まれます。
スキーマを準備する
POST /_emdash/api/import/wordpress/prepare は、次の JSON 形式を受け取ります。
{
"postTypes": [
{
"name": "post",
"collection": "posts",
"fields": [
{
"slug": "title",
"label": "Title",
"type": "string",
"required": true,
"searchable": true
}
]
}
]
}
その data の値には、success、collectionsCreated、fieldsCreated、およびコレクションごとの errors が含まれます。
WXR インポートを実行する
POST /_emdash/api/import/wordpress/execute は、次の内容を持つ multipart/form-data を受け取ります。
file: WXR ファイル。config:postTypeMappings、skipExisting、任意のauthorMappings、任意のimportSections、およびインポート全体に適用される任意のlocaleを含む JSON 文字列。
その data の値には、success、imported、skipped、errors、byCollection、および任意のセクションとタクソノミーの概要が含まれます。
メディアをコピーする
POST /_emdash/api/import/wordpress/media は、JSON { "attachments": [...], "stream": true } を受け取ります。ストリーミングが既定です。ストリーミングのレスポンスは、progress レコードの後に 1 つの result レコードが続く改行区切りの JSON であり、通常の API エンベロープは使用しません。通常のエンベロープで { imported, failed, urlMap } を受け取るには、stream を false に設定します。
メディアの URL を書き換える
POST /_emdash/api/import/wordpress/rewrite-urls は、JSON { "urlMap": { "old": "new" }, "collections": ["posts"] } を受け取ります。任意のコレクションのリストで、書き換えの対象を限定できます。その data の値には、更新されたエントリー数、書き換えられた URL 数、およびエラーが含まれます。
Exporter API を使用する
POST /_emdash/api/import/wordpress-plugin/analyze は、JSON { "url", "token" } を受け取ります。token は、WordPress のユーザーとアプリケーションパスワードの Base64 形式の Basic 認証の値です。その data の値は { success: true, analysis } です。
POST /_emdash/api/import/wordpress-plugin/execute は、url、token、config を含む JSON を受け取ります。管理画面は phase(content、comments、finalize のいずれか)も渡します。各レスポンスには、done、任意の次の cursor、部分的な result、および更新された idMap、translationGroups、commentRoots を含む chunk オブジェクトが含まれます。管理画面は chunk の値をマージし、蓄積したマップを次のリクエストとともに送信します。
トラブルシューティング
サイトは検出されるが、直接インポートできない
wordpress-rest の結果は確認のみです。WXR ファイルをアップロードするか、EmDash Exporter をインストールして、サイトを再度確認してください。
投稿タイプが非互換になる
確認画面で投稿タイプを展開して、競合しているフィールドを見つけます。対象のコレクションを変更するか、Content Types でそのフィールドを調整してください。インポーターは既存のフィールドの型を置き換えません。
一部のメディアが失敗した
最終的なメディアの結果には、失敗したソースの URL が一覧表示されます。各 URL が公開されていて、まだ存在し、プライベートネットワークアドレスへリダイレクトされないことを確認してください。アクセスを修正した後にメディアのステップを再試行します。完了済みのバイト単位で同一のファイルは再利用されます。
次のステップ
- 運用手順については、WordPress から移行するを参照してください。
- コンテンツをインポートした後は、WordPress テーマを移植するを参照してください。
- サイトがカスタムの動作に依存している場合は、WordPress プラグインの移植を参照してください。