Open source · Go · MIT / BSD-3-Clause

Export a WordPress site without touching it

Posts, pages, WooCommerce products, custom post types, navigation menus, approved comments and the whole media library — read over the site's own REST API or XML-RPC, with no plugin to install on the source. One command writes JSON, Markdown, a static-site content source, or a file the importer of twelve other platforms already understands.

Why wpexporter

Everything the site holds, not just what it lists

  • Finds content the index hides

    --brute-force walks IDs past the API listing, custom post types a theme or plugin registered are discovered without a flag, and WooCommerce products are detected on their own. Menus and comments come too — menu structure is the one thing no amount of content can reconstruct afterwards.

  • Output you import, not output you fix

    Media is downloaded and every src, href and srcset rewritten — scheme- and host-insensitively, so a post written in 2010 resolves like one written yesterday. Stale size variants are remapped to the closest surviving width instead of being left as dead paths.

  • Built for long jobs and for agents

    --resume picks an interrupted export back up from its checkpoint, --rate-limit keeps a fragile host standing, and --report-a11y tells you what fails WCAG 2.2 before you publish it. An MCP server puts all of it in reach of Claude and other assistants.

Exports natively to

  • Shopify
  • Magento
  • PrestaShop
  • WordPress (WXR)
  • Drupal
  • Ghost
  • Strapi
  • Contentful
  • Weebly
  • Wix
  • Squarespace
  • Webflow

Install

One binary, four commands

wpexporter is the umbrella command; wpexportjson, wpxmlrpc and wpmcp install alongside it and behave identically.

# macOS / Linux
brew install tradik/tap/wpexporter
# Linux
sudo snap install wpexporter
# Docker
docker pull ghcr.io/tradik/wpexporter:latest

Then point it at a site:

wpexporter export --url https://example.com -f ssg

Formats

Fifteen ways out

The same crawl feeds every format, so choosing a target is one flag — not a second export.

Flag What it writes
-f json The full export as JSON, media localised to /media/… (default)
-f markdown One Markdown file per post and page, YAML front matter, media localised
-f ssg A drop-in content source: paths that mirror the site's URLs, one name per concept in the front matter, body HTML cleaned of the old theme
-f shopify, -f magento, -f prestashop Product CSVs in each store's own import shape
-f wordpress, -f squarespace, -f weebly WXR XML for WordPress and the importers that read it
-f drupal, -f ghost, -f strapi, -f contentful, -f wix JSON shaped for each platform's own migration tool
-f webflow CSVs for Webflow CMS collections, plus a JSON backup

Guides

Documentation

Every guide below is built from this repository's own docs/ folder through content_sources — editing a guide and pushing it is the whole publishing workflow.

20 guides in total — the full directory is in the footer below.