The WordPress import in EmDash runs from the admin. You analyze the source site, prepare compatible collections, import content, copy media, and rewrite URLs. Keep the WordPress site running until the new one has passed verification. That's the whole game.
Before you start
Get these in place first:
- A backup of the WordPress database and
wp-content/uploads. - An EmDash site with storage configured, if you want media copied.
- An EmDash admin account. Import needs the
import:executepermission. - Either a full WXR export or the EmDash Exporter plugin on the WordPress site.
Write down the current permalink structure, canonical origin, redirects, menus, post types, taxonomies and any plugin-owned fields you need to keep. You'll want that list later.
WXR or the Exporter?
A WXR file comes from Tools → Export → All content. It carries posts, pages, custom post types, terms, reusable blocks, authors and attachment URLs. It does not contain the media files themselves; it points back at your WordPress origin.
The EmDash Exporter plugin goes further. It sends authenticated content plus supported site settings, SEO fields, taxonomies and media metadata. With exporter 1.2.0 or later you also get comments, menus, the logo and the favicon.
Check the exporter version. With anything older than 1.2.0, the import still completes without comments and menus, and it won't tell you they're missing.
If you control the WordPress site, use the Exporter. If you only have an export file, WXR works fine for content.
Running the import
- Open Import in the admin sidebar, or go to
/_emdash/admin/import/wordpress. - Upload the WXR file, paste the exporter migration key, or enter the site URL.
- Review the analysis and confirm a target collection for each post type.
- Map WordPress authors to EmDash users. Unmapped authors become guest bylines.
- Start the import. Missing collections and fields get created first.
- Run the media step if attachments were found.
How statuses map
Only publish comes across as published. Everything else, including pending, private, future and trash, lands as a draft. Scheduled dates and visibility rules are not rebuilt, so review every imported draft before you publish it.
Media
EmDash downloads the source bytes, stores them in your configured storage (R2 on Cloudflare), and rewrites matching URLs in your content. Duplicates are detected by a SHA-1 hash of the file, not the filename. The source site has to stay reachable while this runs, and anything behind a login will fail individually.
The cutover checklist
- Count entries by post type and status on both sides.
- Open a representative Gutenberg post, a Classic Editor post, and anything with shortcodes or a page builder.
- Confirm featured and inline images load from EmDash URLs.
- Check authors, bylines, categories, tags and custom taxonomies.
- Crawl the old public URLs and add a redirect for every route that changed.
- Log out and confirm drafts aren't visible.
Then, and only then, move DNS. Keep the backup and the old deployment until rollback is off the table.



