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.
Should you make this move?
Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.
WordPress
- Unmatched ecosystem breadth and content ownership support almost any publishing model
- Editors get a purpose-built publishing workflow instead of raw files
- Plugin, hosting, security, and performance maintenance accumulate over time
- Themes, extensions, and content models add maintenance and portability constraints
Strapi
- 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
- 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
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.
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
Know the shape of the move.
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.
What survives the move.
“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.
| Item | Outcome | Impact | What happens | Mitigation |
|---|---|---|---|---|
| WXR content | partial | critical | Tools → 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 import | lost | critical | strapi 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 types | manual | critical | Strapi'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 files | partial | critical | The 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 plugins | lost | critical | They 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 passwords | partial | high | The 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. |
| Comments | partial | medium | Comments are in the WXR. Strapi has no matching comment thread unless you build one. | Import them into a comment tool or archive the XML. |
| Menus | manual | medium | All 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. |
| Permalinks | manual | critical | Slugs 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. |
| WooCommerce | lost | high | Orders 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 pagination | manual | medium | Strapi'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. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| Post | Strapi collection entry | transform | Map title, slug, content, excerpt, and date. |
| Page | Page collection or a single type | transform | Decide which pages are entries and which are code. |
| Category and tag | Relations or components | transform | Create terms before posts that point at them. |
| Featured image | Media field | manual | Upload the file. Do not leave a WordPress URL in the field. |
| Custom field | Strapi field | manual | The WXR includes custom fields. Add a Strapi field for each one you still show. |
| Author | Relation or a byline string | manual | WordPress user ids will not match Strapi admin ids. |
| Comment | Archive or a comment product | manual | Not a default Strapi feature. |
| Menu | Frontend nav | manual | Rebuild it and check every link. |
| Plugin shortcode | No destination | unsupported | Replace it in the HTML transform or drop the block. |
Make the move recoverable.
Create the source-of-truth backup
Keep the WXR and a copy of uploads before WordPress changes.
- Download All content from Tools → Export.
- Copy wp-content/uploads.
- Export any redirect plugin rules to a spreadsheet.
- Snapshot the WordPress database.
- 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.
Collections
Make Strapi ready for posts without using strapi import.
- Create the post type with the fields your theme shows.
- Create categories and tags.
- Set API permissions for the migration token, then tighten them.
- 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.
WXR or REST load
Create entries and upload media.
- Parse the WXR or walk the REST API until the last page.
- Upload media and store the new ids.
- Create terms, then posts, then relations.
- Render one URL on a preview frontend.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
The things most likely to hurt.
These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.
The WXR is fed to strapi import
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.
Uploads stay on WordPress URLs
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.
Shortcodes ship as raw text
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.
Do the work in this order.
- 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 checkpointExport?
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.
- 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 checkpointBuild 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.
- 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 checkpointFull load?
Go when: Images are on Strapi and shortcodes are gone on the sample.
Stop when: HTML still points at WordPress.
- 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 checkpointStrapi serves content?
Go when: Top URLs render and media is local to Strapi.
Stop when: A menu link 404s.
- 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 checkpointRetire 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.
Cut over with a way back.
Cutover
The frontend reads Strapi. WordPress remains online as the rollback.
- Freeze WordPress edits.
- Export a final WXR and copy any new uploads.
- Load entries and rewrite media URLs.
- Switch the frontend.
- Click the menu and a featured image.
Proof to capture: Top pages render from Strapi and image requests do not hit WordPress.
Rollback
Serve WordPress again without deleting it.
- Point the frontend or DNS back at WordPress.
- Keep the Strapi project for a retry.
- Do not import the WXR with strapi import to undo anything.
- Reopen WordPress editing.
- 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.
- strapi import ran on the WXR
- Images still use wp-content
- Shortcodes are visible
- A top permalink 404s
- Editors have no Strapi login
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | All content | Confirm the WXR was All content, not one category. | Posts, pages, and users you need are in the file. | Export settings note. | |
V-02Blocking | Posts | Compare WordPress post counts with Strapi. | They match the statuses you included. | Count sheet. | |
V-03Blocking | No WordPress URLs | Search Strapi content for the old host. | Featured images and inline images point at Strapi. | Search result. | |
V-04Blocking | Body HTML | Search for leftover shortcode brackets on top posts. | None on the pages you promised to migrate. | Search. | |
V-05Blocking | Categories | Open a post with two categories. | Both relations exist. | Admin screenshot. | |
V-06Blocking | Nav links | Click each primary menu item on preview. | Each one resolves. | Link list. | |
V-07Blocking | Editor | Sign in with a new Strapi user, not a WordPress password. | They can edit posts and cannot change roles. | Role test. | |
V-08Blocking | Import command | Read the shell history for the migration. | strapi import was not pointed at the WXR. | Command list. |
Remove the scaffolding safely.
Safe after: A week on Strapi with images off WordPress and the WXR stored.
- Archive the WXR and the uploads copy.
- Revoke the WordPress application password and the Strapi migration token.
- Keep the WordPress host until rollback ends.
- Remove unused Strapi public permissions you opened for the script.
- Delete preview content types you abandoned.
- Recheck redirects after the first month of 404 logs.
Verify against the primary material.
Platform behavior changes. Check these sources and the review dates above before executing a production migration.
- WordPress: Tools Export screenAccessed 2026-11-03
- Strapi: data importAccessed 2026-11-03
- Strapi: migrate from WordPressAccessed 2026-11-03