mcpField
C
content-portability

content-portability

github.com/respira-press数据与数据库4999 次安装1 周前更新
代码仓库

关于 content-portability

为 WordPress 页面、文章和自定义文章类型创建本地内容包,并支持迁移到其他站点。技能保留页面构建器数据、重映射 ID,并在覆盖前创建快照,也可在 AI 编辑前快速备份。

主要功能

  1. 01导出页面、文章和自定义文章类型
  2. 02保留构建器数据并生成 Markdown 预览
  3. 03可选下载媒体文件供离线使用
  4. 04导入时重映射 ID 并处理冲突
  5. 05覆盖前创建快照并校验导入内容
  6. 06编辑前创建本地备份并比较变更

适用场景

  1. 01将 WordPress 内容迁移到另一站点
  2. 02编辑页面前保存本地备份
  3. 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:选择范围

  1. 询问用户要导出什么:
    • 单个页面/文章:“导出首页”“备份关于页面”
    • 整个站点:“导出所有内容”“下载我的所有内容”
    • 按类型:“导出所有博客文章”“导出作品集项目”
  2. 询问是否要下载媒体:
    • 不包含媒体(默认):速度快、包体积小,并保留 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
        └── ...
  1. 为每个页面/文章写入两个文件:

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"
...
  1. 如果启用了媒体下载:
    • 调用 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:..."
  }
}
  1. 写入 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)
  1. 显示导出统计摘要:
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:读取并验证软件包

  1. 从本地软件包读取 manifest.json
  2. 验证导出版本是否兼容
  3. 报告将导入的内容:“在 example.com 中找到 23 个页面、8 篇文章和 156 个媒体文件”

阶段 2:上传媒体(如果包含) 4. 如果存在包含文件的 media/ 目录:

  • 对每个媒体文件,在目标站点调用 wordpress_upload_media
  • 构建媒体 ID 映射表:{ old_id: 108, new_id: 342 }
  • 记录每次上传;失败时跳过并发出警告
  1. 如果软件包中未包含媒体:
    • 媒体引用将指向原始 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
  1. 询问用户采用哪种批量处理策略:
    • 全部覆盖:用软件包中的内容替换目标内容
    • 跳过冲突项:仅导入无冲突的内容
    • 重命名导入项:为冲突的 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 编辑前快速进行本地备份:

  1. 用户说“编辑前先备份主页”或“先保存一份本地副本”
  2. 调用 wordpress_read_page 并包含完整内容
  3. 写入一个带时间戳的文件:./respira-backups/home-2026-03-16-1430.json
  4. 同时写入 Markdown 预览文件:./respira-backups/home-2026-03-16-1430.md
  5. 确认:“已将主页备份到 ./respira-backups/home-2026-03-16-1430.json”
  6. 继续执行用户请求的编辑
差异比较工作流

将本地导出与站点当前状态进行比较:

  1. 用户说“上次导出后有哪些变化?”或“比较我的备份”
  2. 读取本地 manifest.json,确定已导出的内容
  3. 对每个导出的页面或文章,调用 wordpress_read_page/wordpress_read_post
  4. 将本地 content.json 中的内容哈希与站点当前哈希进行比较
  5. 报告差异:
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

评论

支持 Markdown