Exports WordPress pages, posts, custom posts to portable local packages with builder data, media, markdown previews. Imports with smart ID remapping. Auto-backups before AI edits.
npx claudepluginhub respira-press/agent-skills-wordpressThis skill uses the workspace's default tool permissions.
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.
Extracts content from closed platforms (GoDaddy, Hostinger, HubSpot, Shopify, Squarespace, Webflow, Wix) into WordPress WXR files. Exports products to WooCommerce CSV; supports discovery, verification, resume, and import.
Create 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.
Automates WordPress management: posts, pages, WooCommerce products/orders/inventory, comments, SEO (Yoast/RankMath), media via REST API/WP-CLI. Bulk operations, multi-site, health checks, markdown to Gutenberg.
Share bugs, ideas, or general feedback.
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