关于 content-portability
为 WordPress 页面、文章和自定义文章类型创建本地内容包,并支持迁移到其他站点。技能保留页面构建器数据、重映射 ID,并在覆盖前创建快照,也可在 AI 编辑前快速备份。
主要功能
- 01导出页面、文章和自定义文章类型
- 02保留构建器数据并生成 Markdown 预览
- 03可选下载媒体文件供离线使用
- 04导入时重映射 ID 并处理冲突
- 05覆盖前创建快照并校验导入内容
- 06编辑前创建本地备份并比较变更
适用场景
- 01将 WordPress 内容迁移到另一站点
- 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 和内部链接
- 批量冲突处理——预先检测 slug 冲突,一次决定全部处理方式
- 覆盖任何内容前,必须创建服务器端快照(安全保障)
- 使用完整的 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. 对每个项目,调用 wordpress_read_page 或 wordpress_read_post,并使用 include=builder.extracted,meta.allowlisted 获取包含构建器数据的完整内容
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
└── ...
- 为每个页面/文章写入两个文件:
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/ - 写入
media/media-index.json,将旧 URL 和 ID 映射到本地路径
- 调用
阶段 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. 检查软件包中的每项内容,确认目标站点上是否已存在具有相同 slug 的页面或文章 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
- 询问用户采用哪种批量处理策略:
- 全部覆盖:用软件包中的内容替换目标内容
- 跳过冲突项:仅导入无冲突的内容
- 重命名导入项:为冲突的 slug 添加后缀(例如,
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
- 将所有内部 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并包含完整内容 - 写入一个带时间戳的文件:
./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
错误处理
此技能必须妥善处理以下场景:
| 错误 | 操作 | 用户看到的内容 |
|---|---|---|
| 网站断开连接 | 停止,报告已保存的内容 | "网站无法访问 — 已保存 45/120 个页面" |
| 导出过程中找不到页面 | 跳过,并在清单警告中记录 | "已跳过:About(已删除)" |
| 构建器数据格式错误 | 不使用构建器,导出原始内容 | 清单中显示警告 |
| 磁盘已满 | 停止,报告进度 | "已导出 45 个页面后磁盘已满" |
| 媒体下载返回 404/403 | 跳过文件,并在媒体索引中记录 | "已跳过 3 个媒体文件" |
| 导入时 slug 冲突 | 批量解决(见阶段 3) | 冲突表 |
| 媒体上传文件过大 | 跳过,并记录 | "已跳过:hero.webp(文件过大)" |
| 构建器版本不匹配 | 发出警告,但仍继续导入 | 报告中显示警告 |
关键规则:遇到非致命错误时,始终继续处理(跳过该项并记录)。切勿静默丢弃内容。始终在最后生成警告和跳过项的摘要。
安全模型
- 只读导出:导出期间不更改源网站
- 强制快照:每次覆盖导入前都创建服务器端快照
- 非破坏性导入:创建新内容,或在快照安全保障下覆盖内容
- 随时可回滚:服务器端快照支持通过
wordpress_restore_snapshot一键恢复 - 不暴露凭据:仅导出允许列表中的元数据,不包含 API 密钥、密码或敏感的插件设置
免责声明
此技能无法做到:
- 导出/导入 WordPress 设置、选项或配置
- 导出/导入用户账户或角色
- 导出/导入插件或主题文件
- 处理分类法/术语迁移(分类目录、标签)——未来计划增强
- 保证不同构建器版本之间的渲染效果像素级一致
- 在单次会话中处理超过约 500 个页面的网站(受 token/上下文限制)
此技能可以做到:
- 为页面、文章和自定义文章类型创建完整的本地备份
- 在迁移过程中保留完整的构建器数据(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 — 迁移前或迁移后优化图片
由 Respira 为 WordPress 打造 https://respira.press