How to Migrate from WordPress to EmDash: Step-by-Step Guide (2026)
A complete guide to migrating your WordPress site to EmDash. We cover both the DIY approach and the done-for-you service option.
Migrating your site from one platform to another is daunting. You’re worried about:
- Losing search rankings
- Breaking user experience
- Losing content or functionality
- Downtime
The good news: WordPress to EmDash migration is straightforward. The platform difference is huge, but the content migration is manageable. This guide covers both the DIY approach (if you’re technical) and when to hire a service.
Prerequisites
Before you start, you’ll need:
- Access to your WordPress site (admin credentials, database access if going the DIY route)
- A Cloudflare account (free tier is fine to start)
- An EmDash project (created at https://emdash.io)
- Basic familiarity with static site generation concepts (not required, but helpful)
Method 1: Using the EmDash WordPress Exporter (Recommended for DIY)
EmDash provides an official WordPress exporter plugin. This is the easiest path.
Step 1: Install the EmDash Exporter Plugin
- Go to your WordPress admin dashboard
- Navigate to Plugins → Add New
- Search for “EmDash Exporter”
- Click Install and Activate
Step 2: Export Your Content
- Go to Tools → EmDash Export
- Select the content types you want to export (posts, pages, custom post types)
- Configure:
- Export media files: Yes (recommended)
- Include comments: Choose based on your needs
- Export user data: No (you’ll recreate users in EmDash)
- Click Generate Export
- Download the
.zipfile
This creates a structured export of all your content, formatted for EmDash’s content collections.
Step 3: Prepare Your EmDash Project
- Create a new EmDash project at https://emdash.io (or use existing)
- Clone the project repository locally:
git clone https://github.com/yourusername/your-emdash-project.git cd your-emdash-project
Step 4: Import the Content
- Extract the WordPress export file
- Copy the content files into your EmDash project’s
src/content/directory - Review the frontmatter (title, date, description, etc.) — EmDash uses YAML/TOML frontmatter
- Ensure markdown formatting is correct (WordPress HTML exports need conversion)
Note: EmDash uses TypeScript content collections with Zod schemas. The exporter handles most of this, but you may need to manually adjust:
- Featured images (EmDash expects image paths, not URLs)
- Custom metadata
- Nested categories (EmDash uses tags, not hierarchical categories)
Step 5: Create 301 Redirects
This is critical for SEO. You need to redirect every WordPress URL to its EmDash equivalent.
In Cloudflare Pages:
-
Create a
_redirectsfile in yourpublic/directory:/blog/old-post-slug /blog/new-post-slug 301 /category/news /blog 301 /2024/04/my-post /blog/my-post 301 -
Or use Cloudflare Workers for dynamic redirects (more flexible):
export default { async fetch(request) { const url = new URL(request.url); // Redirect map const redirects = { '/old-url': '/new-url', '/blog/wordpress-post': '/blog/emdash-post', }; if (redirects[url.pathname]) { return Response.redirect(redirects[url.pathname], 301); } return fetch(request); }, };
Pro tip: Use the EmDash migration tools to auto-generate redirect maps from your WordPress export.
Step 6: Test on Staging
-
Build your EmDash project locally:
npm install npm run build npm run preview -
Verify:
- All content is present
- Images display correctly
- Links work (including redirects)
- Layout and styling look good
- No console errors
-
Deploy to a staging environment on Cloudflare Pages:
npm run build # Deploy to staging branch or separate domain -
Test thoroughly in staging — this is where you catch issues before going live.
Step 7: DNS Cutover (Zero Downtime)
This is the moment of truth. You’re pointing your domain to EmDash.
Timing: Plan this for low-traffic hours (e.g., 2 AM on a Tuesday).
-
Verify Cloudflare Pages is set up:
- Your domain’s DNS points to Cloudflare Pages
- SSL certificate is provisioned
- All pages load correctly in staging
-
Plan your cutover sequence:
- Keep WordPress site running (don’t shut it down yet)
- Update DNS to point to EmDash (TTL: 5 minutes)
- Verify the new site is serving correctly
- Keep monitoring for 30 minutes
- After 30 minutes of stable traffic, you can decommission WordPress
-
During cutover:
Old DNS: CNAME yoursite.com → wordpress-server.com New DNS: CNAME yoursite.com → yoursite.pages.dev -
Update DNS records in your registrar (GoDaddy, Namecheap, etc.):
- Point your domain’s CNAME to
yoursite.pages.dev - Update MX records if you’re using email
- Update other DNS records (SPF, DKIM, etc.)
- Point your domain’s CNAME to
-
Wait for propagation (usually 5-15 minutes, up to 48 hours in worst case)
-
Verify:
# Check DNS resolution nslookup yoursite.com # Should return Cloudflare Pages IP # Should load correctly in browser
Method 2: Manual Export via WordPress XML (For Complex Sites)
If the exporter plugin doesn’t handle your setup, you can export manually.
Step 1: Export WordPress Data
- Go to Tools → Export
- Select “All content”
- Download the
.xmlfile (WXR format)
Step 2: Convert to EmDash Format
The XML format needs conversion to markdown. Use a conversion tool:
# Using npm package (example)
npx wordpress-to-markdown yoursite.xml --output ./src/content/blog
This outputs .md files with YAML frontmatter, ready for EmDash.
Step 3: Manual QA
You’ll likely need to:
- Verify markdown formatting
- Fix images paths
- Adjust custom fields
- Handle taxonomies (categories → tags)
This method takes longer but gives you more control.
Handling Special Cases
WooCommerce Stores
WooCommerce migration is more complex and is not yet covered by the current migration service. The EmDash e-commerce layer (shopemdash.com) is currently in development. Once available, it will enable full WooCommerce migrations including products, customer records, and order history.
In the meantime, if your site has a WooCommerce store, you have two options:
- Migrate only the content/blog portion of your site now, and keep WooCommerce on a subdomain temporarily
- Join the shopemdash.com waitlist to be notified when e-commerce migration is available
Custom Post Types
If you have custom post types (e.g., “Portfolio Projects”), you need to:
-
Map them to EmDash content collections:
// src/content/config.ts const portfolio = defineCollection({ type: 'content', schema: z.object({ title: z.string(), description: z.string(), images: z.array(z.string()), projectLink: z.string(), }), }); -
Export the data and create corresponding markdown files
-
Update your templates to render the new collection
Multilingual Sites
If you have a multilingual WordPress site (using WPML or Polylang):
-
Export each language separately
-
Organize in EmDash using localized content collections:
src/content/blog/ ├── en/ │ ├── post-1.md │ └── post-2.md └── fr/ ├── post-1.md └── post-2.md -
Configure Astro i18n routing to serve correct language version
Post-Migration Checklist
After your site is live, verify everything:
- All pages load without errors
- Images display correctly
- Links work (internal and external)
- 301 redirects are working (
curl -I yoursite.com/old-urlshould show 301) - Forms submit correctly
- Google Analytics tracks page views
- Search functionality works
- Mobile layout is responsive
- All features that existed before work now
Monitor for 30 Days
After going live, monitor closely:
- Traffic metrics — Watch for drops in organic/referral traffic (there shouldn’t be any)
- Search Console — Monitor for crawl errors or redirect chains
- Error logs — Check for 404s or server errors
- User feedback — Ask users to report issues
Most issues appear within the first week. By day 30, you can be confident the migration is stable.
When to Use the Professional Service
DIY migration makes sense if:
- Your site is simple (< 50 pages, < 200 posts)
- No custom plugins or post types
- You’re comfortable with technical tasks
- No WooCommerce or complex integrations
Use the professional service if:
- Your site is large (1000+ pages)
- You have custom plugins or post types
- You run WooCommerce
- You can’t afford downtime or issues
- You want guaranteed 30-day post-launch support
WP→EmDash handles:
- Complete content migration
- Design recreation (pixel-perfect if possible)
- All 301 redirects
- Staging validation
- Zero-downtime DNS cutover
- 30-day monitoring and support
- SEO preservation
Cost: $499 for simple sites, custom quotes for complex migrations.
Troubleshooting Common Issues
Images not loading after migration
Cause: Image paths are incorrect
Solution:
// In your Astro components, use correct image paths
import { Image } from 'astro:assets';
<Image src={import('../../images/my-image.png')} alt="..." />
Old URLs not redirecting
Cause: Redirect map is incomplete or misconfigured
Solution:
- Test redirects:
curl -I yourdomain.com/old-url - Verify
_redirectsfile exists inpublic/ - Check Cloudflare Workers script (if using)
- Rebuild and redeploy
Google Search Console showing errors
Cause: Crawl issues during migration
Solution:
- Go to Google Search Console
- Submit your sitemap (Astro generates
sitemap.xmlautomatically) - Mark URLs as “fixed” after verifying they work
- Request re-indexing for critical pages
Performance not as expected
Cause: Unoptimized images or too much JavaScript
Solution:
- Use
astro:assetsfor automatic image optimization - Remove unnecessary JavaScript (EmDash defaults to zero JS)
- Use static generation for all content pages
- Verify Cloudflare caching is enabled
Conclusion
WordPress to EmDash migration is achievable, either DIY or with professional help. The key steps are:
- Export your content (using the official exporter)
- Import into EmDash content collections
- Set up proper 301 redirects
- Test thoroughly on staging
- DNS cutover during low-traffic hours
- Monitor for 30 days
The result: a faster, more secure, cheaper site with zero downtime.
Ready to get started? Get a free migration quote or reach out if you have questions.
Ready to leave WordPress behind?
Get a custom migration quote — usually within 24 hours.