WordPress → Shopify
Move WordPress posts into Shopify blog articles, then redirect the old paths. Shopify article handles do not keep a root-level post URL, and the WordPress export does not include the uploads folder.
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
Shopify
- A polished hosted commerce platform has an unmatched app and partner ecosystem
- Core catalog, order, customer, and promotion workflows are integrated
- Transaction economics, app dependency, and checkout constraints reduce control
- Deep customization usually increases extension, agency, or engineering costs
Shopify: A polished hosted commerce platform has an unmatched app and partner ecosystem. 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: Transaction economics, app dependency, and checkout constraints reduce control.
Jump to a section
Know the shape of the move.
This timeline assumes
- This guide is the content move: posts into a Shopify blog, then redirects. The site already documents WooCommerce → Shopify and Magento → Shopify for catalog, customer, and order work.
- You can download a WordPress WXR and create articles on one Shopify blog. Articles belong to a single blog. The handle is the slug in the article URL.
- You will add redirects before you delete WordPress. A redirect path is unique, at most 1024 characters. The target is at most 255 characters.
- The REST Admin API is legacy as of 1 October 2024. Shopify says new public apps must use the GraphQL Admin API starting 1 April 2025. The admin CSV import is the path that does not require an app.
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 |
|---|---|---|---|---|
| Root-level post URLs | partial | critical | WordPress can publish a post at a path like /post-name. Shopify's article handle is the slug, and the article belongs to a blog. In a March 2024 Shopify Community thread, a partner moving a WordPress site said the new URL picked up a /blogs/news/ prefix, and a reply said a blog URL without a folder prefix is not available. | Create the article, then add a redirect from the old path to the new one. Do not plan on deleting the blog prefix. |
| Redirects that live only in WordPress | lost | critical | The same thread points out that a redirect created inside WordPress stops working when WordPress is deleted. The redirect has to exist on Shopify. | Import a CSV in Shopify admin: Online Store, Navigation, View URL redirects, Import. Columns are Redirect from and Redirect to. |
| Redirect limits | partial | high | Shopify's Redirect resource says path and target are required, paths are unique, path is at most 1024 characters, and target is at most 255. A full URL in path is stored as the path without the domain. A missing path or target returns an error, and the target cannot equal the path. | Use paths such as /post-name and /blogs/news/post-name. Shorten any target that exceeds 255 characters. |
| Themes, plugins, and uploads | lost | critical | The WordPress export page lists posts, pages, custom post types, comments, custom fields, categories, tags, custom taxonomies, and users. All content also includes navigation menus. It does not list themes, plugins, or the uploads folder. | Copy wp-content/uploads yourself. Rebuild the theme in Shopify. Leave plugins behind unless you replace each one. |
| Images inside post HTML | manual | high | Article body_html is HTML. A WordPress post often points images at the old host. The export file is XML, not the image bytes. Shopify can also take an article image as a Base64 attachment. | Rewrite image URLs onto files you host on Shopify before you turn the old site off. |
| Comments | manual | medium | The WXR includes comments. Shopify says an article can have comments. The create-article examples set title, author, tags, body HTML, and published_at. They do not show a field for the old comment thread. | Keep the WXR as the comment archive unless you find a comment import you have tested. |
| Pages and menus | manual | high | Pages and navigation menus can be in the WXR. An article is not a page. This guide's checked path creates blog articles, not Shopify pages or the online-store menu. | List pages and menu items in the inventory. Recreate them in Shopify admin after the posts are in. |
| Authors and dates | partial | medium | You can set article author, tags, body HTML, and published_at on create. published_at is the publish time. created_at on the article resource is read-only. Tags are a comma-separated string. | Set author and published_at from the WXR when you create the article. Do not expect created_at to keep the WordPress date. |
| One article, one blog | partial | medium | Shopify says an article belongs to a single blog. A WordPress post in several categories does not become several articles unless you create them. | Pick the blog for each post. Add the other categories as tags if you need them. |
| Catalog data | manual | high | A WXR of posts is not a product, customer, or order file. Shops that also run WooCommerce need that migration too. | Use the WooCommerce → Shopify guide for the store. Keep this guide on the posts and the redirects. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| Post title | article.title | automatic | Create the article on a blog id. |
| Post slug | article.handle | transform | The handle is the slug. The public URL still includes the blog path. |
| Post body | article.body_html | transform | Rewrite upload URLs before cutover. |
| Author display name | article.author | automatic | A name string, not a WordPress user id. |
| Categories and tags | article.tags | transform | Comma-separated. The blog itself is the primary grouping. |
| Publish date | article.published_at | transform | ISO 8601. created_at is read-only. |
| Featured image file | article.image attachment | manual | Base64 attachment, or a URL you host after you copy uploads. |
| Old path | redirect.path | manual | Unique, max 1024 characters, no domain in the stored path. |
| New article path | redirect.target | manual | Max 255 characters. Cannot equal the path. |
Make the move recoverable.
Create the source-of-truth backup
Keep the WXR and a copy of uploads until Shopify redirects answer the old URLs.
- In WordPress, open Tools, Export. Download All content, then a Posts export if you want a smaller file.
- Copy wp-content/uploads separately. The WXR page does not include that folder.
- Save a spreadsheet of old path, new path, and handle.
- Leave WordPress up until a sample of redirects works on Shopify.
Proof to capture: The WXR, the uploads copy, and the redirect spreadsheet are stored outside both sites.
Posts to articles
Create one Shopify article per post on a single blog.
- Create the blog that will own the posts.
- Map title, author, tags, body HTML, handle, and published_at.
- Copy images and rewrite src values in the HTML.
- Record the public path Shopify gives each article.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
Redirect CSV
Send the old WordPress paths to the new article paths on Shopify.
- Build a CSV with Redirect from and Redirect to.
- Use the path only. Keep each target within 255 characters.
- Import at Online Store, Navigation, View URL redirects.
- Request the old path on the Shopify domain and confirm the target.
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.
Redirects stay in WordPress
The only redirect is a WordPress plugin or a duplicate page.
- Consequence
- Deleting WordPress removes the redirect. Old URLs 404.
- Mitigation
- Import redirects into Shopify before the domain moves.
Stop if: A sample old path does not resolve on Shopify.
Handles are treated as the full URL
The spreadsheet maps /post-name to /post-name on Shopify.
- Consequence
- The article lives under the blog prefix, so the redirect target is wrong.
- Mitigation
- Copy the path from the live Shopify article.
Stop if: You have not opened the article URL on the shop.
Images still point at WordPress
body_html still contains the old uploads host.
- Consequence
- Images break when that host goes away.
- Mitigation
- Rewrite and re-upload before DNS cutover.
Stop if: The uploads copy is incomplete.
Do the work in this order.
- Days 1 to 3 · inventory
Paths and blogs
4 to 8 hours active2 to 3 days elapsedA crawl of current URLs waiting- Export the WXR.
- List post paths.
- Choose the Shopify blog.
Depends on: WordPress admin and a Shopify blog
Stop / go checkpointIs every post assigned to one blog?
Go when: Each post has an old path and a planned handle.
Stop when: You still expect the root path to be the article URL.
- Days 3 to 4 · backup
WXR and uploads
2 to 4 hours active1 day elapsedCopy of uploads waiting- Store the XML.
- Copy uploads.
- Start the redirect spreadsheet.
Depends on: Inventory
Stop / go checkpointCan you restore a post without the live site?
Go when: XML and uploads are both offline copies.
Stop when: Uploads were assumed to be inside the WXR.
- Days 4 to 8 · pilot
A handful of articles
4 to 8 hours active2 to 4 days elapsedImage rewrite waiting- Create a few articles.
- Import their redirects.
- Request the old paths.
Depends on: Spreadsheet
Stop / go checkpointImport the rest?
Go when: Old paths land on the right articles and images load.
Stop when: A target is over 255 characters or matches the path.
- Days 8 to 12 · cutover
The rest, then the domain
4 to 8 hours active2 to 4 days elapsedDNS waiting- Create the remaining articles.
- Import the full redirect CSV.
- Point the domain only after a sample works.
Depends on: Passed pilot
Stop / go checkpointMove DNS?
Go when: Redirects work on the Shopify domain for the sample and the full CSV imported.
Stop when: WordPress is still the only place redirects exist.
- Days 12 to 21 · observe
Watch old URLs
2 to 4 hours active5 to 9 days elapsedSearch Console or server logs waiting- Request the top old paths.
- Fix images that still point at WordPress.
- Keep the WXR.
Depends on: Domain on Shopify
Stop / go checkpointTurn WordPress off?
Go when: The top paths redirect and their images load from Shopify.
Stop when: A top path 404s.
Cut over with a way back.
Cutover
Serve the posts from Shopify and answer the old WordPress paths with Shopify redirects.
- Finish article create for the posts you are keeping.
- Import the redirect CSV in Shopify admin.
- Request old paths against the Shopify domain.
- Rewrite any body HTML that still points at WordPress.
- Move DNS after those checks. Leave WordPress running until then.
Proof to capture: A sample of old paths redirects on Shopify, and those articles do not load images from the WordPress host.
Rollback
Point the domain back at WordPress if Shopify articles or redirects are wrong.
- Move DNS back to WordPress if the new site is the problem.
- Keep the Shopify articles and redirects in place so you can fix them.
- Compare the redirect spreadsheet with the WXR paths.
- Do not delete WordPress until a later attempt passes the same URL checks.
Proof to capture: The domain serves WordPress again, and the WXR plus uploads are still on disk.
- An old path 404s on Shopify
- The article URL has no blog prefix in your sheet
- Images still load from WordPress
- A redirect target exceeds 255 characters
- Two rows use the same path
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | WXR contents | Confirm the file came from Tools, Export, and that uploads were copied separately. | XML is stored, and uploads are a second copy. | Backup folder. | |
V-02Blocking | One blog per article | Read blog_id on a created article. | Each article sits on the blog you chose. | Article admin. | |
V-03Blocking | Live path | Open the article and copy the path. | The path includes the blog segment. The handle is only the last part. | Browser URL. | |
V-04Blocking | Columns and limits | Check Redirect from, Redirect to, unique paths, and target length. | Paths are unique and within 1024 characters. Targets are within 255 and differ from the path. | CSV. | |
V-05Blocking | Admin import | Import at Online Store, Navigation, View URL redirects. | The row count matches the spreadsheet. | Redirect list. | |
V-06Blocking | Old path | Request a sample of old paths on the Shopify domain. | Each one lands on the matching article. | Request log. | |
V-07Blocking | HTML hosts | Search body HTML for the WordPress host. | Kept articles do not depend on that host. | HTML search. | |
V-08 | published_at | Compare a few articles with the WXR dates. | The publish time matches. You did not rely on created_at. | Article dates. |
Remove the scaffolding safely.
Safe after: Top WordPress paths redirect on Shopify and article images load without the old host.
- Keep the WXR and the uploads copy through the rollback window.
- Leave WordPress available until those checks pass.
- Recreate pages and menus that were not articles.
- Store the redirect CSV with the migration notes.
- Use the commerce guides if products and orders still have to move.
- Schedule a check of the redirect list after the first week of logs.
When the plan met reality.
First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.
On 28 March 2024, Shopify partner alex-stoykov wrote that a WordPress site was in the middle of a move to Shopify. Posts lived at /blog-post-name. On Shopify they were becoming /blogs/news/blog-post-name. Rankings depended on those posts. He considered duplicating each WordPress URL into the Shopify shape and redirecting inside WordPress, then noted that deleting WordPress would cancel that redirect. He also asked whether Shopify would let a page keep the old root path. A same-day reply from P1Commerce said a blog URL cannot drop the folder prefix, and described a CSV with Redirect from and Redirect to, imported at Online Store, Navigation, View URL redirects. The thread does not report a finished domain cutover or a measured ranking result.
- Copy the live Shopify article path into the redirect target. The handle alone is not the public URL.
- Put the redirects in Shopify before you delete WordPress. A redirect that exists only in WordPress leaves with it.
- The mid-migration report is the prefix: root WordPress posts became /blogs/news/ paths on Shopify.
- The useful reply is an admin CSV import. The thread never shows that rankings were preserved.
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-04
- Shopify: Article resourceAccessed 2026-11-04
- Shopify: Redirect resourceAccessed 2026-11-04