From Respira WordPress Skills Library
Exports WordPress pages, posts, and custom posts to local portable packages with builder data, media, and markdown. Imports to another site with ID remapping and auto-backup before edits.
How this skill is triggered — by the user, by Claude, or both
Slash command
/respira-wordpress-skills:content-portabilityThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Export WordPress content to portable local packages. Import to another site with smart ID remapping. Auto-backup before AI edits. Full builder data preservation, human-readable markdown previews, and optional media download.
Export WordPress content to portable local packages. Import to another site with smart ID remapping. Auto-backup before AI edits. Full builder data preservation, human-readable markdown previews, and optional media download.
Exports:
Imports:
Auto-Backup:
./respira-backups/Phase 1: Scope Selection
Phase 2: Content Enumeration
3. Call wordpress_list_pages, wordpress_list_posts, and/or wordpress_list_custom_posts to enumerate content in scope
4. For each item, call wordpress_read_page or wordpress_read_post with include=builder.extracted,meta.allowlisted to get full content with builder data
5. Report progress every 10 items: "Exported 30/120 pages..."
Phase 3: Write Local Package 6. Create the export directory structure:
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 — machine-readable, contains:
{
"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 — human-readable markdown preview:
# 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 to get all media itemsmedia/uploads/media/media-index.json mapping old URLs and IDs to local pathsPhase 4: Manifest & Stats
9. Write 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/
Phase 1: Read & Validate Package
manifest.json from the local packagePhase 2: Upload Media (if included)
4. If media/ directory exists with files:
wordpress_upload_media on the target site{ old_id: 108, new_id: 342 }Phase 3: Detect Conflicts 6. For each content item in the package, check if a page/post with the same slug already exists on the target site 7. Present all conflicts upfront in a single table:
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)Phase 4: Snapshot Existing Content 9. MANDATORY: Before overwriting any existing content, take a server-side snapshot of each target page/post using the existing snapshot system
before_edit snapshot kind automatically via MCP write operationsPhase 5: Create/Update Content
10. For each content item:
- If no conflict or overwrite strategy: call wordpress_update_page or wordpress_update_post
- Set title, content, excerpt, status, and allowlisted meta
- Build the post ID mapping table: { old_id: 42, new_id: 187 }
11. Report progress every 10 items
Phase 6: Rewrite & Inject Builder Data
12. For each imported page/post that has builder data:
- Take the builder JSON from content.json
- Rewrite all media IDs using the media ID mapping table
- Rewrite all internal post/page IDs using the post ID mapping table
- Rewrite all internal URLs from source domain to target domain
- Call wordpress_inject_builder_content to apply the rewritten builder data
Phase 7: Verify & Report
13. For each imported page/post:
- Re-read via wordpress_read_page/wordpress_read_post
- Compare content hashes to source hashes
- Flag any mismatches
14. Show import report:
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.
A lightweight mode for quick local backups before AI editing:
wordpress_read_page with full includes./respira-backups/home-2026-03-16-1430.json./respira-backups/home-2026-03-16-1430.mdCompare local export against current site state:
manifest.json to identify exported contentwordpress_read_page/wordpress_read_postcontent.json against current site hashesContent 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
The skill must handle these scenarios gracefully:
| Error | Action | User Sees |
|---|---|---|
| Site disconnected | Stop, report what was saved | "Site unreachable — 45/120 pages saved" |
| Page not found mid-export | Skip, log in manifest warnings | "Skipped: About (deleted)" |
| Malformed builder data | Export raw content without builder | Warning in manifest |
| Disk full | Stop, report progress | "Disk full after 45 pages" |
| Media download 404/403 | Skip file, log in media-index | "Skipped 3 media files" |
| Slug conflict on import | Bulk resolution (see Phase 3) | Conflict table |
| Media upload too large | Skip, log | "Skipped: hero.webp (too large)" |
| Builder version mismatch | Warn, import anyway | Warning in report |
Key rule: Always continue on non-fatal errors (skip the item, log it). Never silently drop content. Always produce a summary of warnings/skips at the end.
wordpress_restore_snapshotWhat this skill CANNOT do:
What this skill CAN do:
wordpress_list_pages / wordpress_list_posts / wordpress_list_custom_posts — enumerate contentwordpress_read_page / wordpress_read_post / wordpress_get_custom_post — read full content with builder datawordpress_list_media / wordpress_get_media — media enumeration and metadatawordpress_upload_media — upload media during importwordpress_update_page / wordpress_update_post / wordpress_update_custom_post — create/update content during importwordpress_inject_builder_content — apply rewritten builder data during importwordpress_get_active_site / wordpress_get_site_context — verify connection and site detailswordpress_list_snapshots / wordpress_restore_snapshot — safety net for importsBuilt by Respira for WordPress https://respira.press
npx claudepluginhub respira-press/agent-skills-wordpressCreate and manage WordPress posts, pages, media, categories, tags, and menus using WP-CLI or REST API. For blog posts, page updates, media uploads, bulk operations.
Front door for website migration: detects platform, inventories content, then asks the user which reconstruct path to take (blocks+products or theme replication) before extracting and dispatching the matching sub-skill.
Executes Webflow CMS migrations from WordPress, Contentful, Strapi, CSV/JSON using Data API v2 bulk endpoints, data mapping, validation, and strangler fig pattern.