content-portability について
WordPress のページ、投稿、カスタム投稿タイプをローカルパッケージ化し、別サイトへ移行するスキルです。ビルダーのデータを保持し、インポート時に ID を再割り当てします。上書き前のスナップショットや AI 編集前のバックアップにも対応します。
主な機能
- 01ページ、投稿、カスタム投稿タイプのエクスポート
- 02ビルダーデータの保持と Markdown プレビュー作成
- 03オフライン用メディアの任意ダウンロード
- 04インポート時の ID 再割り当てと競合解決
- 05上書き前のスナップショットとインポート検証
- 06編集前のローカルバックアップと変更比較
活用シーン
- 01WordPress コンテンツの別サイトへの移行
- 02ページ編集前のローカルバックアップ
- 03エクスポート後の変更内容の確認
MCP 対応
Respira MCP でコンテンツの一覧取得と読み取り、メディアのアップロード、コンテンツのインポートを行います。スナップショットツールで上書き前の復元手段を確保します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ respira-press/ agent-skills-wordpress --skill content-portabilityインストール後、Claude Code で/content-portabilityを入力して読み込まれたか確認します。
詳細
コンテンツのポータビリティ
WordPress のコンテンツを、持ち運び可能なローカルパッケージにエクスポートします。スマートな ID の再マッピングにより、別のサイトにインポートできます。AI による編集前に自動バックアップを作成します。ビルダーのデータを完全に保持し、人が読みやすい Markdown プレビューを作成できます。メディアのダウンロードも任意で行えます。
このスキルでできること
エクスポート:
- 固定ページ、投稿、カスタム投稿タイプ — 個別または一括
- 標準コンテンツと併せて、ビルダーのデータ全体(Elementor、Bricks、Divi など)をエクスポート
- 許可リストに登録された投稿メタデータ(SEO フィールド、アイキャッチ画像、ビルダー設定)
- 各固定ページ/投稿の、人が読みやすい Markdown プレビュー
- 完全なオフラインパッケージ用の、メディアファイルのバイナリデータの任意ダウンロード
- ハッシュ、統計、エクスポートのメタデータを含むマニフェスト
インポート:
- ローカルの Respira Content Package を読み込み、対象の WordPress サイトに送信
- スマートな ID の再マッピング — 対象サイトに合わせて、メディア ID、投稿 ID、内部リンクを書き換え
- 一括での競合解決 — スラッグの重複を事前に検出し、すべてに対して一度だけ判断
- 上書きの前に、サーバー側のスナップショットを必ず作成(安全策)
- ID の完全なマッピングテーブルを使って、ビルダーの JSON を書き換え
- 再インポートしたコンテンツを読み取り、ハッシュを比較して忠実性を検証
自動バックアップ:
- AI 編集の前にクイックバックアップモードを使用 — ローカルスナップショットを
./respira-backups/に保存 - タイムスタンプ付きで人が読みやすく、手間のかからない保険
必要条件
- Respira for WordPress プラグインがインストールされ、有効化されていること
- MCP 接続が設定されていること(サイト URL と API キー)
- インポートする場合:対象サイトへの書き込みアクセス権
- メディアをダウンロードする場合:ローカルディスクに十分な空き容量があること
使い方
起動フレーズ
- 「サイトをエクスポートして」
- 「ホームページをエクスポートして」
- 「編集前に固定ページをバックアップして」
- 「コンテンツをローカルにダウンロードして」
- 「別のサイトにコンテンツを移行して」
- 「コンテンツのポータビリティ」
- 「ローカルバックアップを作成して」
- 「メディア付きでエクスポートして」
エクスポートのワークフロー
フェーズ 1:対象の選択
- エクスポートする対象をユーザーに確認します:
- 単一の固定ページ/投稿:「ホームページをエクスポートして」「概要ページをバックアップして」
- サイト全体:「すべてエクスポートして」「すべてのコンテンツをダウンロードして」
- 種類別:「すべてのブログ投稿をエクスポートして」「ポートフォリオ項目をエクスポートして」
- メディアのダウンロードも含めるか確認します:
- メディアなし(デフォルト):URL 参照を含む、小さくて高速なパッケージ
- メディアあり:参照されている画像やファイルをすべてローカルにダウンロードし、完全なオフラインポータビリティを実現
フェーズ 2:コンテンツの列挙
3. wordpress_list_pages、wordpress_list_posts、および/または wordpress_list_custom_posts を呼び出し、対象範囲のコンテンツを列挙します
4. 各項目について、include=builder.extracted,meta.allowlisted を指定して wordpress_read_page または wordpress_read_post を呼び出し、ビルダーのデータを含む完全なコンテンツを取得します
5. 10 項目ごとに進捗を報告します:「30/120 件の固定ページをエクスポートしました……」
フェーズ 3:ローカルパッケージの作成 6. エクスポートディレクトリの構造を作成します:
respira-export/
├── manifest.json # Package metadata, source site, export date, hashes
├── README.md # One-line import prompt for zero-friction migration
├── pages/
│ ├── home/
│ │ ├── content.json # Full machine-readable export
│ │ └── content.md # Human-readable markdown preview
│ ├── about/
│ │ ├── content.json
│ │ └── content.md
│ └── ...
├── posts/
│ ├── 2024-hello-world/
│ │ ├── content.json
│ │ └── content.md
│ └── ...
├── cpt/ # Custom post types
│ └── {post_type}/
│ └── {slug}/
│ ├── content.json
│ └── content.md
└── media/ # Only if --with-media
├── media-index.json # URL→local-path mapping with old media IDs
└── uploads/
├── hero-image.webp
└── ...
- 各固定ページ/投稿について、2 つのファイルを書き込みます:
content.json — 機械可読形式。以下を含みます:
{
"export_version": "1.0",
"source_site": "https://example.com",
"exported_at": "2026-03-16T14:30:00Z",
"post": {
"id": 42,
"post_type": "page",
"title": "About Us",
"slug": "about",
"status": "publish",
"content": "<full HTML content>",
"excerpt": "...",
"modified": "2026-03-10T09:00:00Z"
},
"builder": {
"name": "bricks",
"payload": {},
"extracted": {}
},
"meta": {
"_thumbnail_id": 108,
"_yoast_wpseo_title": "About Us | Example"
},
"hashes": {
"content_hash": "sha256:abc123...",
"builder_hash": "sha256:def456...",
"meta_hash": "sha256:ghi789..."
}
}
content.md — 人が読みやすい Markdown プレビュー:
# About Us
**Source:** https://example.com/about/
**Type:** page | **Status:** publish | **Builder:** Bricks
**Exported:** 2026-03-16
---
[Rendered text content extracted from HTML, preserving headings and structure]
## Section: Hero
- Heading: "Welcome to Our Company"
- Text: "We've been helping businesses..."
- Image: hero-team-photo.webp (Media ID: 108)
## Section: Team
- Heading: "Meet the Team"
...
- メディアのダウンロードが有効な場合:
wordpress_list_mediaを呼び出して、すべてのメディア項目を取得します- エクスポートしたコンテンツから参照されているメディア項目だけに絞り込みます
- 各ファイルをダウンロードして
media/uploads/に保存します - 古い URL と ID をローカルパスに対応付ける
media/media-index.jsonを書き込みます
フェーズ 4:マニフェストと統計
9. manifest.json を書き込みます:
{
"export_version": "1.0",
"source_site": "https://example.com",
"source_wordpress_version": "6.7.1",
"source_respira_version": "4.3.1",
"exported_at": "2026-03-16T14:30:00Z",
"scope": "full_site",
"content": {
"pages": 23,
"posts": 8,
"custom_post_types": { "portfolio": 12, "testimonial": 5 }
},
"media": {
"included": true,
"files": 156,
"total_bytes": 52428800
},
"warnings": [],
"skipped": [],
"hashes": {
"manifest_hash": "sha256:..."
}
}
README.mdを書き込みます:
# Respira Content Package
Exported from: https://example.com
Date: 2026-03-16
Contents: 23 pages, 8 posts, 17 custom posts, 156 media files
## To import this content to another site
Tell your AI agent:
> Import the content package from ./respira-export/
## Package format
- content.json files contain full machine-readable content with builder data
- content.md files are human-readable previews
- media/ contains downloaded media files (if included)
- エクスポートの統計概要を表示します:
Export Complete
━━━━━━━━━━━━━━━━━━━━━━━━━━
Pages exported: 23
Posts exported: 8
Custom posts: 17
Media files: 156
Package size: 52.4 MB
Warnings: 0
Skipped: 0
━━━━━━━━━━━━━━━━━━━━━━━━━━
Saved to: ./respira-export/
インポートのワークフロー
フェーズ 1:パッケージの読み込みと検証
- ローカルパッケージから
manifest.jsonを読み込みます - エクスポートバージョンとの互換性を検証します
- インポート対象を報告します:「example.com から 23 ページ、8 件の投稿、156 個のメディアファイルが見つかりました」
フェーズ 2:メディアのアップロード(含まれている場合)
4. ファイルを含む media/ ディレクトリが存在する場合:
- 各メディアファイルについて、対象サイトで
wordpress_upload_mediaを呼び出します - メディア ID マッピングテーブルを作成します:
{ old_id: 108, new_id: 342 } - 各アップロードを記録し、失敗した場合は警告を出してスキップします
- パッケージにメディアが含まれていない場合:
- メディア参照は元の URL を指します(サイト間参照)
- その旨をユーザーに警告します
フェーズ 3:競合の検出 6. パッケージ内の各コンテンツ項目について、対象サイトに同じスラッグのページまたは投稿がすでに存在するか確認します 7. すべての競合を、以下の単一のテーブルにまとめて事前に表示します:
Slug Conflicts Detected (5 of 23 pages)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Slug Source Title Target Title
about About Us About Our Company
contact Contact Contact Us
team Our Team The Team
services Services Our Services
faq FAQ FAQ
- 一括での解決方法をユーザーに尋ねます:
- すべて上書き:対象サイトのコンテンツをパッケージのコンテンツで置き換えます
- 競合をスキップ:競合しないコンテンツのみインポートします
- インポート項目の名前を変更:競合するスラッグに接尾辞を追加します(例:
about-imported)
フェーズ 4:既存コンテンツのスナップショット 9. 必須:既存のコンテンツを上書きする前に、既存のスナップショットシステムを使用して、対象の各ページ/投稿のサーバー側スナップショットを取得します
- MCP の書き込み操作により、
before_editスナップショット種別が自動的に使用されます - 常にロールバックできるようにします
フェーズ 5:コンテンツの作成/更新
10. 各コンテンツ項目について:
- 競合がない場合、または上書き方法を選択した場合は、wordpress_update_page または wordpress_update_post を呼び出します
- タイトル、コンテンツ、抜粋、ステータス、許可リストに含まれるメタデータを設定します
- 投稿 ID マッピングテーブルを作成します:{ old_id: 42, new_id: 187 }
11. 10 項目ごとに進捗を報告します
フェーズ 6:ビルダーデータの書き換えと注入
12. ビルダーデータを含むインポート済みの各ページ/投稿について:
- content.json からビルダーの JSON を取得します
- メディア ID マッピングテーブルを使って、すべてのメディア ID を書き換えます
- 投稿 ID マッピングテーブルを使って、すべての内部投稿 ID/ページ ID を書き換えます
- 送信元ドメインから対象ドメインへ、すべての内部 URL を書き換えます
- 書き換えたビルダーデータを適用するため、wordpress_inject_builder_content を呼び出します
フェーズ 7:検証と報告
13. インポートした各ページ/投稿について:
- wordpress_read_page/wordpress_read_post で再読み込みします
- コンテンツハッシュを送信元のハッシュと比較します
- 不一致があれば報告します
14. インポートレポートを表示します:
Import Complete
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Pages imported: 23 (5 overwrites, 18 new)
Posts imported: 8 (0 overwrites, 8 new)
Media uploaded: 156 (2 skipped — too large)
Builder data: 19 pages with builder content rewritten
ID remappings: 187 references updated
Hash verification: 46/48 match (2 minor diffs flagged)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Server-side snapshots taken for all overwrites.
自動バックアップのワークフロー
AI による編集前に、ローカルへすばやくバックアップするための軽量モードです。
- ユーザーが「編集前にホームページをバックアップして」または「先にローカルコピーを保存して」と指示します
- すべての項目を含めて
wordpress_read_pageを呼び出します - タイムスタンプ付きのファイルを 1 つ作成します:
./respira-backups/home-2026-03-16-1430.json - Markdown プレビューも作成します:
./respira-backups/home-2026-03-16-1430.md - 次のように確認します:「ホームページを
./respira-backups/home-2026-03-16-1430.jsonにバックアップしました」 - 依頼された編集を続行します
差分のワークフロー
ローカルのエクスポートと現在のサイトの状態を比較します。
- ユーザーが「前回のエクスポート以降に何が変わった?」または「バックアップとの差分を見せて」と指示します
- ローカルの
manifest.jsonを読み込み、エクスポートされたコンテンツを特定します - エクスポートされた各ページ/投稿について、
wordpress_read_page/wordpress_read_postを呼び出します - ローカルの
content.jsonのコンテンツハッシュと、現在のサイトのハッシュを比較します - 差分を報告します:
Content Changes Since Export (2026-03-16)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Changed:
about Content updated (builder + text)
homepage Builder layout changed
pricing Text content changed
Unchanged: 21 pages, 8 posts
New on site: 2 pages (not in export)
Deleted: 0 pages
エラー処理
スキルは、次の状況に適切に対処する必要があります。
| エラー | アクション | ユーザーに表示される内容 |
|---|---|---|
| サイトへの接続が切断された | 停止し、保存済みの内容を報告する | "サイトに接続できません — 120ページ中45ページを保存しました" |
| エクスポート中にページが見つからない | スキップし、マニフェストの警告に記録する | "スキップ:About(削除済み)" |
| ビルダーのデータ形式が不正 | ビルダーなしで生のコンテンツをエクスポートする | マニフェストに警告を記録 |
| ディスク容量が不足 | 停止し、進捗を報告する | "45ページの処理後にディスク容量が不足しました" |
| メディアのダウンロードが404/403 | ファイルをスキップし、media-indexに記録する | "メディアファイルを3件スキップしました" |
| インポート時にスラッグが競合 | 一括で解決する(フェーズ3を参照) | 競合テーブル |
| メディアのアップロードサイズが大きすぎる | スキップし、記録する | "スキップ:hero.webp(サイズ超過)" |
| ビルダーのバージョンが一致しない | 警告を出し、インポートは続行する | レポートに警告を記録 |
重要なルール:致命的でないエラーが発生しても、常に処理を続行してください(項目をスキップして記録します)。コンテンツを黙って破棄しないでください。最後に必ず警告とスキップの概要を出力してください。
安全性モデル
- 読み取り専用のエクスポート:エクスポート中にソースサイトを変更しません
- 必須のスナップショット:上書きを伴うインポートの前に、必ずサーバー側のスナップショットを取得します
- 非破壊的なインポート:新しいコンテンツを作成するか、スナップショットによる安全策を講じたうえで上書きします
- ロールバックに対応:サーバー側のスナップショットにより、
wordpress_restore_snapshotを使ってワンクリックで復元できます - 認証情報の非公開:エクスポートするのは許可リストに含まれるメタデータのみです。APIキー、パスワード、機密性の高いプラグイン設定は含まれません
正直な免責事項
このスキルでできないこと:
- WordPressの設定、オプション、構成のエクスポート/インポート
- ユーザーアカウントやロールのエクスポート/インポート
- プラグインやテーマのファイルのエクスポート/インポート
- タクソノミー/ターム(カテゴリー、タグ)の移行(今後の機能強化)
- 異なるバージョンのビルダー間で、ピクセル単位で完全に同じ表示を保証すること
- 1回のセッションで約500ページを超えるサイトを処理すること(トークン/コンテキストの制限)
このスキルでできること:
- 固定ページ、投稿、カスタム投稿タイプの完全なローカルバックアップを作成する
- 移行時にビルダーのデータ全体を保持する(Elementor、Bricks、Divi)
- 完全にオフラインで利用できるパッケージ用にメディアをダウンロードする
- すべてのコンテンツについて、人が読めるMarkdownプレビューを生成する
- IDをスマートに再マッピングして、サイト間でコンテンツを移行する
- 安心してAI編集できるよう、編集前に自動でバックアップする
- ローカルバックアップと現在のサイトの状態を比較する
Respira MCP ツールの使用
wordpress_list_pages/wordpress_list_posts/wordpress_list_custom_posts— コンテンツを列挙wordpress_read_page/wordpress_read_post/wordpress_get_custom_post— ビルダーのデータを含む完全なコンテンツを読み取りwordpress_list_media/wordpress_get_media— メディアの列挙とメタデータの取得wordpress_upload_media— インポート時にメディアをアップロードwordpress_update_page/wordpress_update_post/wordpress_update_custom_post— インポート時にコンテンツを作成/更新wordpress_inject_builder_content— インポート時に書き換えたビルダーのデータを適用wordpress_get_active_site/wordpress_get_site_context— 接続とサイトの詳細を確認wordpress_list_snapshots/wordpress_restore_snapshot— インポート時の安全策
関連スキル
- Site Onboarding — 初回実行時のガイド。サイトの機能を確認します
- WordPress Site DNA — サイトの詳細な調査と健全性スコアの算出
- Technical Debt Audit — 移行前に孤立したコンテンツや未使用のプラグインを検出
- WordPress AI Image Optimizer — 移行前または移行後に画像を最適化
WordPress向けにRespiraが開発 https://respira.press