← All playbooks
CMS migration

WordPress → Strapi

Export WordPress with Tools Export, then create Strapi collections and post entries through the API. The WXR file is not a Strapi archive. strapi import would wipe the destination.

Typical timeline1 to 3 weeks20 to 45 hours active work
Statusneeds review
Source profileWordPress Tools Export docs reviewed 2026-11-03
Destination profileStrapi import docs and Strapi's WordPress migration guide reviewed 2026-11-03
Documentation date
Review window
Evidence3 sources
This route needs review.Use it as a planning baseline, then verify the dated sources and test with representative data before production.
Before you migrate

Should you make this move?

Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.

Current platform

WordPress

Reasons to stay
  • Unmatched ecosystem breadth and content ownership support almost any publishing model
  • Editors get a purpose-built publishing workflow instead of raw files
Reasons to leave
  • Plugin, hosting, security, and performance maintenance accumulate over time
  • Themes, extensions, and content models add maintenance and portability constraints
New platform

Strapi

What gets better
  • An open-source headless CMS with a writable admin, REST, GraphQL, and a readable export archive
  • Editors get a purpose-built publishing workflow instead of raw files
What gets worse
  • Self-hosting, schema code, and custom importers become your problem when you leave a SaaS CMS
  • Themes, extensions, and content models add maintenance and portability constraints
Best of the move

Strapi: An open-source headless CMS with a writable admin, REST, GraphQL, and a readable export archive. This removes a major source-side concern: Plugin, hosting, security, and performance maintenance accumulate over time.

Worst of the move

What you lose: Unmatched ecosystem breadth and content ownership support almost any publishing model. What you inherit: Self-hosting, schema code, and custom importers become your problem when you leave a SaaS CMS.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome11 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 4, Manual rebuild: 4, Not transferred: 3.
Clean0
Partial4
Manual4
Lost3
Mapping route8 of 9 fields have a destination path

This timeline assumes

  • You can open Tools → Export on the WordPress site and download a WXR file.
  • Strapi is empty enough that designing content types is the work, not a restore.
  • Themes, plugins, and WooCommerce orders are out of scope unless you map them yourself.
  • The site already documents WordPress → Contentful and WordPress → Sanity.
02What transfers

What survives the move.

“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.

ItemOutcomeImpactWhat happensMitigation
WXR contentpartialcriticalTools → Export downloads a WordPress eXtended RSS file. WordPress says it contains posts, pages, custom post types, comments, custom fields, categories, tags, custom taxonomies, and users. All content also includes navigation menus. You can filter posts or pages by author, date, and status.Export All content for the archive. Use a filtered file only for a pilot.
strapi importlostcriticalstrapi import loads a Strapi export and deletes existing data first, including uploads. Schemas must match. Admin users are not in the restore. If uploads use shared cloud storage, removing media rows can delete the remote objects.Never pass a WXR file to strapi import.
Content typesmanualcriticalStrapi's WordPress guide tells you to create a collection, such as Post, with fields for title, slug, content, excerpt, and featured image, then POST entries. That guide is Strapi's, so treat the field list as their tutorial, and match it to your theme.Create types from the content you actually publish. Load one post before the full file.
Media filespartialcriticalThe export screen documents content records, not a zip of wp-content/uploads. Strapi's guide says to list media from the WordPress REST API and upload each file with Strapi's Upload API, then relink it.Copy uploads while WordPress is still online. A WXR URL dies with the old host.
Themes and pluginslostcriticalThey are not in the WXR description. Shortcodes and blocks will not render in Strapi.Inventory shortcodes. Replace them in the transform, or keep those pages on WordPress.
Users and passwordspartialhighThe WXR includes users as export data. Strapi admin accounts are separate, and a Strapi restore would not bring admin users back even from a Strapi file.Invite editors in Strapi. Do not expect WordPress passwords to work.
CommentspartialmediumComments are in the WXR. Strapi has no matching comment thread unless you build one.Import them into a comment tool or archive the XML.
MenusmanualmediumAll content export includes navigation menus. Strapi will not build the same menu component unless you map it.Recreate the menu in the frontend or as entries, and click every item.
PermalinksmanualcriticalSlugs can move into a UID field. Rank Math or redirect plugins do not export as Strapi routes.Keep the slug and add redirects for anything that changed.
WooCommercelosthighOrders and products are not what the Tools Export article describes as the WXR payload. A store needs the commerce guides, not this one.If you sell, use the WooCommerce → Magento or other commerce playbook for the catalog. This page is posts and pages.
REST paginationmanualmediumStrapi's guide also shows reading posts from /wp-json/wp/v2/posts. That is a paged API, not a single dump.Follow pagination until a short page. Do not stop at the first 10 posts.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
PostStrapi collection entrytransformMap title, slug, content, excerpt, and date.
PagePage collection or a single typetransformDecide which pages are entries and which are code.
Category and tagRelations or componentstransformCreate terms before posts that point at them.
Featured imageMedia fieldmanualUpload the file. Do not leave a WordPress URL in the field.
Custom fieldStrapi fieldmanualThe WXR includes custom fields. Add a Strapi field for each one you still show.
AuthorRelation or a byline stringmanualWordPress user ids will not match Strapi admin ids.
CommentArchive or a comment productmanualNot a default Strapi feature.
MenuFrontend navmanualRebuild it and check every link.
Plugin shortcodeNo destinationunsupportedReplace it in the HTML transform or drop the block.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep the WXR and a copy of uploads before WordPress changes.

  1. Download All content from Tools → Export.
  2. Copy wp-content/uploads.
  3. Export any redirect plugin rules to a spreadsheet.
  4. Snapshot the WordPress database.
  5. Leave the site online until Strapi preview matches.

Proof to capture: The WXR opens in an editor and the uploads folder size matches what you expect.

Transformation · Strapi Content-Type Builder

Collections

Make Strapi ready for posts without using strapi import.

  1. Create the post type with the fields your theme shows.
  2. Create categories and tags.
  3. Set API permissions for the migration token, then tighten them.
  4. Stop if the next command is strapi import of the WXR.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

Transformation · A script, following Strapi's WordPress guide

WXR or REST load

Create entries and upload media.

  1. Parse the WXR or walk the REST API until the last page.
  2. Upload media and store the new ids.
  3. Create terms, then posts, then relations.
  4. Render one URL on a preview frontend.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

05Handle with care

The things most likely to hurt.

These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.

Pilot

The WXR is fed to strapi import

criticalpossible likelihood

The file is named like an import and the command says import.

Consequence
Strapi deletes its database and can delete shared cloud files.
Mitigation
Load with the API. Reserve strapi import for Strapi backups.

Stop if: The file extension is xml and the command is strapi import.

Cutover

Uploads stay on WordPress URLs

criticallikely likelihood

Content HTML still points at wp-content.

Consequence
Images break when DNS moves.
Mitigation
Rewrite URLs to Strapi media after upload.

Stop if: A sample post still references the WordPress host.

Pilot

Shortcodes ship as raw text

highlikely likelihood

The body still contains bracketed shortcodes.

Consequence
Readers see plugin syntax.
Mitigation
Replace or strip them in the transform and read a page.

Stop if: A top page shows a shortcode.

06Precise timeline

Do the work in this order.

Estimate forA WordPress site of posts and pages, with uploads you can copy and a frontend you control
Total elapsed1 to 3 weeks
Active work20 to 45 hours
BufferAdd time for WooCommerce, a page builder, or thousands of media files.
01
Days 1 to 3Types and shortcodes2 to 3 days
02
Days 3 to 5WXR and uploads1 to 2 days
03
Days 5 to 12Ten posts4 to 7 days
04
Days 12 to 15Load and switch1 to 3 days
05
Days 15 to 22Keep WordPress7 days
  1. Days 1 to 3 · inventory

    Types and shortcodes

    4 to 8 hours active2 to 3 days elapsedEditor review waiting
    • List post types, shortcodes, and menus.
    • Confirm whether a store is in scope.

    Depends on: WordPress admin

    Stop / go checkpoint

    Export?

    Go when: Posts and pages have Strapi types. Commerce is explicitly out or handled elsewhere.

    Stop when: A page builder owns the layout and nobody has a plan for it.

  2. Days 3 to 5 · backup

    WXR and uploads

    3 to 8 hours active1 to 2 days elapsedDownload waiting
    • Export All content.
    • Copy uploads and the database.

    Depends on: Admin access

    Stop / go checkpoint

    Build types?

    Go when: The WXR and uploads are stored off the web root.

    Stop when: The export is a filtered slice and you thought it was everything.

  3. Days 5 to 12 · pilot

    Ten posts

    8 to 20 hours active4 to 7 days elapsedUploads waiting
    • Create collections.
    • Load ten posts with images.
    • Preview the frontend.

    Depends on: Backup

    Stop / go checkpoint

    Full load?

    Go when: Images are on Strapi and shortcodes are gone on the sample.

    Stop when: HTML still points at WordPress.

  4. Days 12 to 15 · cutover

    Load and switch

    4 to 10 hours active1 to 3 days elapsedAPI writes waiting
    • Load the rest.
    • Add redirects.
    • Point DNS or the frontend env at Strapi.

    Depends on: Pilot

    Stop / go checkpoint

    Strapi serves content?

    Go when: Top URLs render and media is local to Strapi.

    Stop when: A menu link 404s.

  5. Days 15 to 22 · observe

    Keep WordPress

    2 to 4 hours active7 days elapsedEditors waiting
    • Watch 404s.
    • Leave WordPress up.

    Depends on: DNS or env switch

    Stop / go checkpoint

    Retire WordPress?

    Go when: A week of pages look right and the WXR is archived.

    Stop when: Uploads or a post type are still only in WordPress.

07The point of change

Cut over with a way back.

Go live

Cutover

The frontend reads Strapi. WordPress remains online as the rollback.

Recommended window: After the ten-post pilot, with WordPress still backed up.

  1. Freeze WordPress edits.
  2. Export a final WXR and copy any new uploads.
  3. Load entries and rewrite media URLs.
  4. Switch the frontend.
  5. Click the menu and a featured image.

Proof to capture: Top pages render from Strapi and image requests do not hit WordPress.

Return to safety

Rollback

Serve WordPress again without deleting it.

Deadline: Before you delete the WordPress host or the uploads copy.

  1. Point the frontend or DNS back at WordPress.
  2. Keep the Strapi project for a retry.
  3. Do not import the WXR with strapi import to undo anything.
  4. Reopen WordPress editing.
  5. Note which Strapi entries were created after the freeze if you need them later.

Proof to capture: WordPress serves the site and the database snapshot still exists.

Rollback immediately when
  • strapi import ran on the WXR
  • Images still use wp-content
  • Shortcodes are visible
  • A top permalink 404s
  • Editors have no Strapi login
08Verification report

Prove the migration worked.

Every blocking check must pass. Capture the evidence before cleanup begins.

0%
Interactive report preview0 / 8 checks passed
PassIDCheckMethodExpected resultEvidence
V-01BlockingAll contentConfirm the WXR was All content, not one category.Posts, pages, and users you need are in the file.Export settings note.
V-02BlockingPostsCompare WordPress post counts with Strapi.They match the statuses you included.Count sheet.
V-03BlockingNo WordPress URLsSearch Strapi content for the old host.Featured images and inline images point at Strapi.Search result.
V-04BlockingBody HTMLSearch for leftover shortcode brackets on top posts.None on the pages you promised to migrate.Search.
V-05BlockingCategoriesOpen a post with two categories.Both relations exist.Admin screenshot.
V-06BlockingNav linksClick each primary menu item on preview.Each one resolves.Link list.
V-07BlockingEditorSign in with a new Strapi user, not a WordPress password.They can edit posts and cannot change roles.Role test.
V-08BlockingImport commandRead the shell history for the migration.strapi import was not pointed at the WXR.Command list.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: A week on Strapi with images off WordPress and the WXR stored.

  1. Archive the WXR and the uploads copy.
  2. Revoke the WordPress application password and the Strapi migration token.
  3. Keep the WordPress host until rollback ends.
  4. Remove unused Strapi public permissions you opened for the script.
  5. Delete preview content types you abandoned.
  6. Recheck redirects after the first month of 404 logs.
Sources and evidence

Verify against the primary material.

Platform behavior changes. Check these sources and the review dates above before executing a production migration.

  1. WordPress: Tools Export screenAccessed 2026-11-03
  2. Strapi: data importAccessed 2026-11-03
  3. Strapi: migrate from WordPressAccessed 2026-11-03