← All playbooks
CMS migration

WordPress → Payload

Export WordPress content and media to WXR, model pages, posts, and blocks in Payload, then pull files while WordPress is still online. Themes, plugins, and passwords do not move.

Typical timeline1 to 3 weeks when the theme is real workSeveral days active work
Statusneeds review
Source profileWordPress Tools Export docs reviewed 2026-11-06
Destination profilePayload WordPress migration posts and Local API docs reviewed 2026-11-06
Documentation date
Review window
Evidence4 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

Payload

What gets better
  • Open-source collections, blocks, and a Local API keep the content model in code you can host yourself
  • Editors get a purpose-built publishing workflow instead of raw files
What gets worse
  • There is no one-click importer, so schema, rich text, and media are a scripted project
  • Themes, extensions, and content models add maintenance and portability constraints
Best of the move

Payload: Open-source collections, blocks, and a Local API keep the content model in code you can host yourself. 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: There is no one-click importer, so schema, rich text, and media are a scripted project.

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 export from Tools, Export, and WordPress stays reachable. Payload's tutorial says the media WXR contains links, so the script fetches files from the live site.
  • Payload is a headless CMS you configure in code. Part 2 of the vendor tutorial is the frontend, which you build. It is not a theme import.
  • The tutorial maps pages, posts, authors, categories, Gutenberg blocks, media, and menus. ACF and other plugins need their own fields.
  • The site already documents WordPress → Strapi, WordPress → Contentful, and WordPress → Sanity.
  • Comments, users' passwords, and WooCommerce orders are out of scope unless you add them.
02What transfers

What survives the move.

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

ItemOutcomeImpactWhat happensMitigation
Pages and postspartialcriticalPayload's part 1 maps pages to a Pages collection and posts to a Posts collection. You create them with a script or by hand. The sample post walks Cover, Paragraph, and Image blocks.Model those collections first. Store the WordPress post id. Import a sample before the full WXR.
Gutenberg blocksmanualcriticalThe tutorial parses block markup and rebuilds Payload blocks, plus a React component to render each one. Payload does not run PHP blocks.List every block in use. Build the ones on real pages. Leave unused blocks out.
MediapartialcriticalTools, Export, Media downloads a WXR of links. The tutorial says the site must stay online so the script can fetch the files into an upload collection.Run the media script while WordPress answers. Check file sizes. Do not cancel hosting first.
Authors and categoriespartialhighThe tutorial uses a Users collection for authors and a categories collection for terms. WordPress passwords are not in the WXR.Create Payload users and send them a new login. Map categories before posts.
MenusmanualmediumThe tutorial puts navigation in header and footer globals, not a menu importer.Rebuild the menus in globals before the frontend cutover.
Theme and pluginslostcriticalPart 2 says you build the frontend. PHP templates, widgets, and plugin tables do not become Payload config.Treat the theme as a rewrite. Keep WordPress up until the new frontend matches the pages you care about.
ACF and custom fieldsmanualhighThe tutorial calls out posts that use ACF as something you map into collection fields. The core WXR will not invent those fields.Add a field per ACF key you still render. Skip the rest on purpose.
CommentslostmediumThe published tutorial does not import comments.Export comments if you must keep them, and tell readers if the new site drops them.
PermalinkspartialcriticalWordPress slugs can move into Payload slug fields. The sample gives Home the slug index and says to replace it with an empty string later.Keep public slugs. Add redirects where you changed them.
Users and rolesmanualhighWordPress roles are not Payload access functions. Nobody keeps their password.Recreate the few people who edit. Set access in config.
WooCommerce and other plugin datalosthighOrders, subscriptions, and form entries live in plugin tables. A content WXR does not include them.Leave the shop on WordPress or plan a separate commerce move. The site has WordPress → Shopify if that is the real project.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
WordPress pagePages collectiontransformHome may need an empty slug, not index.
WordPress postPosts collectiontransformStore the WordPress id.
Gutenberg blockPayload block and a React componentmanualThe tutorial starts with Cover, Paragraph, and Image.
Media WXRUpload collectiontransformFetch files from the live site.
CategoryCategories collectiontransformImport terms before posts.
AuthorUsers collectionmanualNo passwords in the export.
MenuHeader and footer globalsmanualRebuild the items.
ACF fieldCollection fieldmanualOnly the keys you still render.
Theme templatesNo destinationunsupportedPart 2 is a new frontend.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep WXR exports and a database dump before the script writes to Payload.

  1. Export all content from Tools, Export.
  2. Export media to its own WXR.
  3. Dump the database if you have plugin tables you might need later.
  4. Record post, page, and attachment counts.
  5. Store checksums.

Proof to capture: Checksums and the three counts.

Transformation · Payload config

Model the collections the tutorial names

Have a place for pages, posts, media, users, and categories.

  1. Create Pages, Posts, Categories, Users, and a Media upload collection.
  2. Add blocks for the Gutenberg blocks you actually use.
  3. Add a wordpressId field.
  4. Create header and footer globals for menus.

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

Transformation · WXR plus the Local API

Import media, then posts

Resolve images before body HTML points at them.

  1. Leave WordPress online.
  2. Parse the media WXR and upload each file.
  3. Parse posts and pages. Convert blocks you support. Link authors and categories.
  4. Write a row to an exception file when a block or a file fails.

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.

Media

Media links die when WordPress goes offline

criticallikely likelihood

The tutorial says the WXR holds links and the script fetches them from WordPress.

Consequence
Uploads fail or half the library is empty.
Mitigation
Finish media import before you take WordPress down.

Stop if: Any referenced file failed to download.

Content

Blocks render as raw HTML

highlikely likelihood

Unmapped Gutenberg blocks have no Payload component.

Consequence
Pages look empty or show markup.
Mitigation
Inventory blocks first. Ship components for the ones in use.

Stop if: A top page uses a block you have not mapped.

Frontend

The theme is treated as data

highpossible likelihood

Part 2 is a new frontend, not an import of PHP.

Consequence
You cut over a site that does not match.
Mitigation
Compare the templates you still need before DNS or the client switch.

Stop if: A required template has no React block.

06Precise timeline

Do the work in this order.

Estimate forOne WordPress site, WXR export, Payload collections from the vendor tutorial
Total elapsed1 to 3 weeks when the theme is real work
Active workSeveral days
BufferPlugin fields and odd blocks add a pass. A blog with few blocks is shorter.
01
Day 1Export content and media1 day
02
Days 2 to 4Collections and blocks3 days
03
Days 5 to 7Media, then posts3 days
04
Days 8 to 10Render the blocks3 days
05
Day 11Freeze WordPress and switch1 day
  1. Day 1 · export

    Export content and media

    2 hours active1 day elapsedNone if the export is small waiting
    • Export content and media.
    • Count posts, pages, and attachments.
    • List blocks and plugins that own content.
    Stop / go checkpoint

    Do the files open?

    Go when: Counts match wp-admin and both WXR files are stored.

    Stop when: Media export is missing.

  2. Days 2 to 4 · model

    Collections and blocks

    1 to 2 days active3 days elapsedNone waiting
    • Add the collections and blocks.
    • Create the first admin user.
    • Decide which ACF keys you will keep.

    Depends on: export

    Stop / go checkpoint

    Is the model enough for the sample?

    Go when: The blocks on the sample pages exist.

    Stop when: A top page needs a block you have not named.

  3. Days 5 to 7 · import

    Media, then posts

    1 to 2 days active3 days elapsedFile downloads waiting
    • Upload media from the live site.
    • Import categories, authors, posts, and pages.
    • Log failed blocks.

    Depends on: model

    Stop / go checkpoint

    Did the sample import?

    Go when: Counts match and failed rows are listed.

    Stop when: Media failures are unexplained.

  4. Days 8 to 10 · frontend

    Render the blocks

    2 to 4 days active3 days elapsedNone waiting
    • Build the React blocks from part 2.
    • Rebuild menus.
    • Compare a set of live URLs.

    Depends on: import

    Stop / go checkpoint

    Does the branch match WordPress closely enough?

    Go when: The URL sample matches and images are local.

    Stop when: A required template is missing.

  5. Day 11 · cutover

    Freeze WordPress and switch

    2 hours active1 day elapsedDelta import waiting
    • Stop publishing.
    • Export and import the delta.
    • Send readers to the new frontend.

    Depends on: frontend

    Stop / go checkpoint

    Stay on Payload?

    Go when: The delta is in and the URL sample still passes.

    Stop when: A post went out after the freeze and is not in Payload.

07The point of change

Cut over with a way back.

Go live

Cutover

Serve the new frontend from Payload while WordPress is frozen and still online long enough to finish media.

Recommended window: After the URL sample passes, with the editor who publishes most often told to stop.

  1. Set WordPress to stop new publishes. Record the time.
  2. Export the delta and import it.
  3. Re-check media on the pages you sampled.
  4. Switch the public host to the new frontend.
  5. Leave WordPress running read-only.

Proof to capture: Freeze time, delta counts, and the URL sample.

Return to safety

Rollback

Put readers back on WordPress if pages or media are wrong.

Deadline: While WordPress hosting is still up. Do not cancel it in the same week.

  1. Point DNS or the proxy back at WordPress.
  2. Keep the Payload database for the diff.
  3. Copy any Payload-only edits back into WordPress before editors use the old admin again.
  4. Re-enable publishing.
  5. List the URLs that failed.

Proof to capture: WordPress answers the public host and Payload-only edits are written down.

Rollback immediately when
  • A sampled URL 404s or shows the wrong blocks.
  • Images 404 because WordPress was turned off early.
  • A post published after the freeze is missing.
  • A required plugin feature has no replacement.
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
CNT-01BlockingPost and page countsCompare WordPress counts with the collections.Counts match or exceptions are listed.The count table.
MED-01BlockingFiles downloadedCompare attachment count with the upload collection and spot-check sizes.No zero-byte files on pages you sampled.The size check.
BLK-01BlockingBlock coverageList Gutenberg blocks in the WXR and the blocks you render.Every block that appears on a sampled page has a component.The block list.
URL-01BlockingSlug sampleRequest the old paths against the new frontend.Each important URL resolves once.Status codes.
AUT-01BylinesOpen posts from two authors.The byline matches WordPress.The two posts.
CAT-01BlockingCategoriesCompare term counts and one archive.The archive lists the same posts.The archive URL.
PWD-01BlockingEditors have new loginsAsk an editor to sign in to Payload.They get in without a WordPress password.The user id.
FRZ-01BlockingNo late postsCompare WordPress post dates with the freeze.Later posts are in the delta.The date check.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: The new frontend has been public for a week and media no longer depends on WordPress.

  1. Archive the WXR files and the database dump.
  2. Leave WordPress read-only until the retention date.
  3. Remove import-only Payload users.
  4. Turn off WordPress plugins that were only there to help the export.
  5. Set the next review date.
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-06
  2. Payload: migrate from WordPress, part 1Accessed 2026-11-06
  3. Payload: migrate from WordPress, part 2Accessed 2026-11-06
  4. Payload: Local APIAccessed 2026-11-06