Moving a blog off WordPress is less work than the size of WordPress suggests. A personal blog is posts, pages, pictures and a set of addresses. WordPress will hand you the first three in one file, and the fourth is a list you can write down.
The part people get wrong is the addresses. Do the move carelessly and every link anyone ever made to your blog stops working on the day you switch. Do it properly and nobody notices anything except that the site got faster.
This guide covers the whole move. If you’re still deciding whether to make it, WordPress vs a static site weighs the two.
What you’re actually moving
| Thing | Does it move? |
|---|---|
| Posts and pages | Yes. They are in the export file. |
| Categories and tags | Yes. |
| Photos | Yes, but not in the export file. See Step 2. |
| Your addresses | Yes, if you plan for them. See Step 5. |
| Comments | They are in the export, but a static site has nowhere to put new ones. |
| Search, contact forms | No. They need a replacement. See Step 6. |
| Your theme and plugins | No. You choose a new design. |
Step 1: Export your content
In WordPress, go to Tools → Export, leave All content selected, and choose Download Export File. You get one XML file, in a format called WXR.
It is the same on WordPress.com. A very large site there is sent as a zip of several files by email instead.
The file holds your posts, pages, comments, categories, tags, custom fields and menus. It does not hold your theme, your plugins or their settings.
Step 2: Understand where the photos are
This is the surprise. The export file doesn’t contain your photos. It contains the address of each one. Whatever imports the file has to go and fetch the pictures from your old site.
So keep the old site online until the import has finished. If you cancel the hosting first, the pictures are gone and the import has nothing to download.
On WordPress.com you can also download the media library as a single archive from Tools → Export Media Files, on sites without plugins. It is worth doing as a backup either way.
Step 3: Write down your permalink structure
Open Settings → Permalinks and note which structure the blog uses. It decides what every one of your addresses looks like.
| Structure | An address looks like |
|---|---|
| Plain | /?p=123 |
| Day and name | /2026/10/02/sample-post/ |
| Month and name | /2026/10/sample-post/ |
| Numeric | /archives/123 |
| Post name | /sample-post/ |
Four of these are paths, and a static site can answer a path. Plain is not. It is a question mark and a number, answered by WordPress’s database, and a static host has no way to tell ?p=123 from ?p=124. If your blog uses Plain addresses, those links can’t be kept, whatever tool you use.
Step 4: Import into your new home
Where the posts go is up to you: a static site generator such as Hugo or Jekyll, or an app that builds the site for you. Most can read a WXR file, directly or through a converter. The best way to self-host a personal blog compares the options.
Whatever you use, check four things afterwards.
- Dates. Posts should keep their original dates, or your archive is scrambled.
- Pictures. Open a few posts and make sure the images load from your new site and not from the old one.
- Private posts. Anything that was private, password-protected or scheduled should not have become public.
- Shortcodes. Square-bracket codes from plugins mean nothing outside WordPress. Look for stray
[something]in the text.
Step 5: Keep the old addresses working
Keep the same domain. That is the single most important decision in the whole move. A link to yourblog.com/2019/05/a-post/ can only be rescued if you still control yourblog.com.
Then one of two things is true for each post.
The new address is the same as the old one. Nothing to do.
The new address is different. You need a redirect from the old to the new. Google’s own guidance is to use a permanent, server-side redirect wherever you can. How you make one depends on the host.
| Host | How to redirect |
|---|---|
| Netlify | A _redirects file with one rule per line: /old-path /new-path 301. |
| Cloudflare Pages | The same file. Write the 301 explicitly, because the default there is a temporary redirect. A site can have up to 2,000 plain rules. |
| Your own server | A rule in the server’s configuration, such as nginx’s return 301. |
| A host with no redirect feature | A small page at the old address containing an instant “meta refresh” to the new one. Google says it treats an instant meta refresh as a permanent redirect. |
Leave the redirects in place for at least a year. In practice, leave them for ever. They cost nothing.
Step 6: Replace the parts that needed a server
A static site has no code running on the server, so three things need a different answer.
Comments. The old comments are history; decide whether to keep them as part of each post’s text or let them go. For new conversation, many personal blogs now use a “reply by email” link, which arrives in private and attracts no spam.
Search. A small script and an index on your own site can search a few hundred posts instantly, with no server. Search on a static site explains how.
Contact forms. A mailto: link is the simplest replacement. If you need a real form, a form-handling service will take the submissions.
Step 7: Switch over
- Publish the new site somewhere temporary and click through it.
- Test a handful of old addresses, especially your most-linked posts.
- Point the domain at the new host.
- Leave the old WordPress site reachable at a spare address for a few weeks, in case you find something missing.
Because the domain hasn’t changed, there is nothing to tell search engines. They will simply find faster pages at the addresses they already know.
Where Selfish fits
Selfish is a native app for iPhone, iPad and Mac that builds a static site and publishes it to hosting you control. It imports the WordPress export file directly.
- Posts, pages, categories, tags, excerpts and featured images come across.
- Photos are downloaded from your old site at full size, and stripped of their location on the way in.
- Captions, galleries and embeds keep their place. Private, password-protected, pending and scheduled posts arrive as drafts.
- Each post remembers its old address. On Netlify and Cloudflare Pages Selfish writes the redirects file for you. On other hosts it publishes the small forwarding page.
- Comments stay behind, and Plain
?p=123addresses can’t be kept, for the reasons above.
Nothing is published until you have read it through. It is on the App Store as a one-time purchase, at a £3.99 introductory price, rising to £9.99 in December. Import a site covers the import step by step, and Selfish vs WordPress.com is the honest comparison.