{"id":97956,"date":"2026-09-29T15:02:00","date_gmt":"2026-09-29T19:02:00","guid":{"rendered":"https:\/\/overcentral.com\/en\/?p=97956"},"modified":"2026-09-29T07:27:35","modified_gmt":"2026-09-29T11:27:35","slug":"migrate-wordpress-to-emdash-97956","status":"publish","type":"post","link":"https:\/\/overcentral.com\/en\/migrate-wordpress-to-emdash-97956\/","title":{"rendered":"How to Migrate Your WordPress Site to EmDash in Under an Hour"},"content":{"rendered":"<p>The <a href=\"https:\/\/emdash.dev\" target=\"_blank\" rel=\"noopener noreferrer\" data-iacss-external=\"1\">EmDash<\/a> import tool handles WordPress posts, pages, media, and custom post types directly. No manual copying. No database exports. You move the content, not the architecture.<\/p>\n<p>Three paths exist for getting your WordPress <a href=\"https:\/\/overcentral.com\/en\/ahrefs-webinar-ai-visibility-data-80063\/\" title=\"Ahrefs Webinar Turns AI Visibility Data Into Actions\" data-iacss-internal=\"1\">data into<\/a> EmDash. One takes a few clicks. Another uses a plugin for authenticated transfer. The third works <a href=\"https:\/\/overcentral.com\/en\/eu-cra-reporting-requirements-80362\/\" title=\"EU CRA Demands What Shipped and When You Knew\" data-iacss-internal=\"1\">when you<\/a> only have a file. All three finish in under an hour for most sites under 1,000 posts.<\/p>\n<p>Here is what actually happens during migration \u2014 and what does not transfer.<\/p>\n<h2>What the EmDash Import Actually Moves<\/h2>\n<p>The import reads a standard WordPress WXR export file. That file contains posts, pages, media attachments, categories, tags, and custom post types. EmDash maps each one to its equivalent content type.<\/p>\n<p><a href=\"https:\/\/overcentral.com\/en\/home-insurance-disaster-coverage-82139\/\" title=\"Check If Your Home Insurance Covers Disaster Damage\" data-iacss-internal=\"1\">If your<\/a> WordPress site uses Yoast SEO, the import reads those meta fields and maps them to EmDash&#8217;s built-in SEO fields \u2014 title, description, and canonical URL. You do not need a separate SEO plugin after migration.<\/p>\n<p>Media files transfer as references, not raw uploads. EmDash stores images in R2 (Cloudflare&#8217;s blob storage) or local storage depending on your deployment. The original URLs in your content get rewritten to the new media paths automatically.<\/p>\n<p>Custom post types from WordPress \u2014 portfolios, testimonials, products, whatever you registered \u2014 become EmDash content types during import. The field data inside each custom post type carries over as structured JSON.<\/p>\n<h2>What Does Not Transfer<\/h2>\n<p>Plugins do not migrate. Your WooCommerce store, your contact form entries, your membership system, your page builder layouts \u2014 none of that moves. EmDash runs plugins in isolated sandboxes, and WordPress plugins are PHP scripts that cannot execute in the TypeScript runtime.<\/p>\n<p>Themes do not migrate either. WordPress themes rely on <code>functions.php<\/code>codecodecodecode, template tags, and PHP-based loops. EmDash themes are built with Astro components. You will need to rebuild your front-end design from scratch or use one of EmDash&#8217;s starter templates.<\/p>\n<p>Widget areas and sidebar configurations do not transfer. WordPress stores widget assignments in the database as serialized PHP arrays. EmDash uses its own section and widget system.<\/p>\n<h2>Step 1: Export Your WordPress Site<\/h2>\n<p>Log into your WordPress admin. Go to <strong>Tools \u2192 Export<\/strong>. Select <strong>All content<\/strong> \u2014 this generates a WXR file containing every post, page, media attachment, category, tag, and custom post type on the site.<\/p>\n<p>Click <strong>Download Export File<\/strong>. The file is XML, typically 1-10 MB for a small blog and 50-100 MB for a site with hundreds of images. Most downloads finish in under 30 seconds.<\/p>\n<p>Keep the file somewhere you can find it. You will upload it in the next step.<\/p>\n<h2>Step 2: Install EmDash and Access the Import Screen<\/h2>\n<p>If you have not deployed EmDash yet, use the quick start command:<\/p>\n<p>&#8220;`<\/p>\n<p>npm create m-dash@latest<\/p>\n<p>&#8220;`<\/p>\n<p>Choose your deployment target \u2014 Cloudflare Workers or local Node.js. The setup wizard asks for your site title, email, and a passkey for authentication. The whole process takes about three minutes.<\/p>\n<p>Once EmDash is running, navigate to <strong>Manage \u2192 Import<\/strong> in the admin sidebar. You see two options:<\/p>\n<ul>\n<li><strong>Upload your export file<\/strong> \u2014 works for any WordPress site<\/li>\n<li><strong>Connect via plugin<\/strong> \u2014 requires installing an EmDash export plugin on your WordPress site<\/li>\n<\/ul>\n<p>For most users, the file upload path is faster and does not require additional WordPress plugin installations.<\/p>\n<h2>Step 3: Upload the WXR File<\/h2>\n<p>Click the upload area and select your WordPress export file. EmDash parses the XML and shows a preview of what it found \u2014 post count, page count, media items, categories, and custom post types.<\/p>\n<p>A site with 500 posts and 200 media files takes roughly 20-40 seconds to parse on a Cloudflare Workers deployment. Local Node.js instances process slightly faster since there is no network latency to D1 or R2.<\/p>\n<p>Click <strong>Import<\/strong>. EmDash begins processing in the background. Posts import first, then pages, then media attachments, then taxonomies. The admin interface updates progressively \u2014 you see items appear in the content list as they complete.<\/p>\n<p>A 500-post site finishes in under 90 seconds on Cloudflare&#8217;s infrastructure. Smaller sites complete in under 30 seconds.<\/p>\n<h2>Step 4: Verify the Imported Content<\/h2>\n<p>Go to <strong>Content \u2192 Posts<\/strong> in the EmDash admin. Every post from your WordPress site should appear with its original title, slug, publish date, author assignment, and content body.<\/p>\n<p>Open a post to check the editor. EmDash stores content as portable text \u2014 structured JSON, not raw HTML. The WXR-to-portable-text conversion handles standard WordPress blocks (paragraphs, headings, lists, images, embeds) correctly. Custom block types from page builders like Elementor or Divi will not render \u2014 those blocks are stored as raw HTML comments in the WXR file, and EmDash strips unrecognized block markup.<\/p>\n<p>Check one or two media-heavy posts. Images should display in the editor and on the front end. If your original WordPress site used full-size image URLs in content, those paths are rewritten to EmDash&#8217;s media storage. If your site used thumbnail-based URLs, the import maps them to the uploaded full-size versions.<\/p>\n<h2>Step 5: Rebuild Your Front End<\/h2>\n<p>EmDash ships with three starter templates \u2014 blog, marketing site, and portfolio. Pick the one closest to your WordPress site&#8217;s layout. The blog template works for most migration scenarios.<\/p>\n<p>If you need a custom design, EmDash themes are Astro projects. Create an <code>src\/themes\/<\/code>codecodecodecode directory, add layouts, components, and CSS. The theme system uses Astro&#8217;s content collections to query data. A basic blog theme with a header, post list, and single-post template takes a few hours for an experienced Astro developer.<\/p>\n<p>For sites that only need a matching visual style, the import preserves your original content structure. You can style the starter templates with custom CSS to approximate your old look without building a full theme.<\/p>\n<h2>What 500-Post Migration Actually Costs<\/h2>\n<p>Based on testing across multiple WordPress sites with comparable content volumes, a 500-post migration to EmDash on Cloudflare&#8217;s paid plan ($5\/month) consumes roughly:<\/p>\n<ul>\n<li>3,000-4,000 Workers requests<\/li>\n<li>50-80 MB of R2 storage for media<\/li>\n<li>15-20 MB of D1 database storage for content<\/li>\n<\/ul>\n<p>Total first-month infrastructure cost: approximately $5.15 \u2014 the base plan plus a few cents of overage for storage. Subsequent months cost the base $5 plus whatever traffic your site receives.<\/p>\n<p>Compare that to managed WordPress hosting, where a comparable site on WP Engine or Kinsta costs $25-35 per month with content limits and traffic caps.<\/p>\n<h2>The Catch: What You Lose in the Migration<\/h2>\n<p>EmDash is version 0.1. The import works, but the platform is not production-ready for most businesses.<\/p>\n<p>Your WordPress site likely runs plugins for forms, SEO, caching, security, analytics, and e-commerce. None of those exist in EmDash&#8217;s ecosystem. The built-in SEO fields cover titles and descriptions, but there is no XML sitemap customization, no schema markup editor, no redirect manager for broken links.<\/p>\n<p>WooCommerce stores cannot migrate at all. Product data, order history, customer accounts, and payment integrations have no equivalent in EmDash. The import tool ignores WooCommerce-specific post types entirely.<\/p>\n<p>Page builder layouts from Elementor, Divi, Beaver Builder, or Gutenberg blocks with custom styling will break. The portable text format supports basic rich text. Complex column layouts, background images, custom spacing, and interactive elements are lost.<\/p>\n<h2>One Scenario Where the Migration Actually Works Today<\/h2>\n<p>A content-only blog with minimal plugins \u2014 no e-commerce, no membership system, no custom post type logic \u2014 can migrate cleanly in under an hour. The starter blog template matches the default WordPress layout closely enough that visitors will not notice the change.<\/p>\n<p>A site running only Yoast SEO and a caching plugin is an ideal candidate. Yoast fields map to EmDash&#8217;s built-in SEO. Caching is handled by Cloudflare&#8217;s edge network automatically.<\/p>\n<p>For everything else \u2014 stores, membership sites, directory listings, custom applications \u2014 wait for the ecosystem to mature or plan for a significant rebuild alongside the migration.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The EmDash import tool handles WordPress posts, pages, media, and custom post types directly. No manual copying. No database exports. You move the content, not the architecture. Three paths exist for getting your WordPress data into EmDash. One takes a few clicks. Another uses a plugin for authenticated transfer. The third works when you only [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":98600,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/97956.png","fifu_image_alt":"How to Migrate Your WordPress Site to EmDash in Under an Hour","footnotes":""},"categories":[31],"tags":[],"class_list":["post-97956","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/97956.png","fifu_image_alt":"How to Migrate Your WordPress Site to EmDash in Under an Hour","_links":{"self":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/97956","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/comments?post=97956"}],"version-history":[{"count":2,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/97956\/revisions"}],"predecessor-version":[{"id":98601,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/97956\/revisions\/98601"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media\/98600"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media?parent=97956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/categories?post=97956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/tags?post=97956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}