Where it is
Open Blog Posts and press Import from WordPress or Export for WordPress. The page has two tabs: Import reads WordPress's export file into this blog, and Export writes this blog as a file WordPress reads.
Importing needs permission to write posts, to manage categories, tags and authors, and to add media, and a plan that includes the blog and adding media. Exporting needs only permission to view the blog, on every plan: without the rights to import, the page shows the Export tab only, and says so when your plan is the reason.
Importing
In WordPress, open Tools → Export, choose All content and press Download Export File. A Posts export works too, but it has no category tree, none of the photos used only inside posts, and no primary category for a post (its deepest category becomes the primary). Upload the file here as WordPress saved it (up to 64 MB). Nothing is saved until you have seen the preview and pressed Start the import.
The options:
- Your WordPress site's address: read from the file. Keep it the same each time you import from that site, because it is how posts imported before are recognised.
- New posts are: As in WordPress or All drafts. It decides new posts only: an update brings the status the post has in WordPress. Private, password-protected and pending posts always come in as drafts: this blog has no private or password-protected posts.
- Posts imported before: Leave as they are, or Update from the file. An update changes only what the file holds: the title, body, excerpt, status, dates, categories and tags, and each SEO field the file has a Yoast or Rank Math value for (a field it lacks keeps what it has here). The address, translations, review state, photos and authors you set here stay; a post with no author here gets the file's. A body that differs from the file only in spacing is left as it is. An archived post stays archived.
- Credit the posts to: The authors in the file (each becomes an author here with its display name; the e-mail is not kept, and WordPress exports no bio or photo), or one existing author.
- Posts built with a page builder: shown when the file has some. Elementor and similar builders keep their layout to themselves, so such a post comes in as a draft with its text, photos and address for you to lay out again, or is left out. A later update never changes such a post's text or status, so the layout you rebuild here stays. One saved with no text at all (an Elementor page never saved as HTML) is left out.
- Send visitors of the old addresses here: redirects from each published post's and each category's and tag's WordPress address. Enter the old site's category and tag address parts if it changed them (WordPress, Settings → Permalinks). An old address that is a live page here, one of this site's own sections (such as the store), or one you redirected yourself is never taken over, nor is a post whose new address you redirected elsewhere yourself; the preview lists them. Only posts this import writes and that will be live here are redirected: none when every new post is a draft, and none for posts left as they are (choose Update from the file to redirect those). Feeds, page 2 and later of an archive, attachment pages and author archives are not redirected. To keep the old post addresses exactly as they are (a WordPress site whose posts sit at
/post-name/), leave the post address empty in Blog settings → Permalinks before you import. - Fetch photos from: the old site's own addresses, ticked; any other address the photos are on (a CDN, S3) is listed unticked. A photo on an address left unticked is not fetched (one inside a post keeps pointing there) and is listed in the post's notes. Fetch photos from another address: if the old domain already points here, where the old site still answers.
Update the preview after changing an option. The preview shows how many posts will be created, updated or left alone, the categories, tags and authors it will create, what the file holds that is not imported (pages, products, the trash), and notes for each post it had to change, such as an address already in use here (the post gets -copy).
What the import does with the posts
- Categories keep their tree. A category or tag that already exists here with the same address is reused, never renamed. WordPress's default category becomes this blog's Uncategorized.
- Block-editor and classic posts are both converted: paragraphs, headings, lists, quotes, images with their captions, galleries, tables and code. Embeds (such as YouTube), audio and video become links. Scripts and forms are removed. A shortcode this blog does not know stays as text, and a block WordPress builds only when the page is shown (such as Latest posts) is left out. Each post's notes say what changed.
- Links between imported posts point at their new addresses, and keep working when you rename a post later. A link to the old site's other pages (its shop, a page that is not in the file) or to its files (a PDF) is left as it is and listed in the post's notes.
- A file whose dates carry no time zone is read on this site's clock, and the preview says so.
- SEO from Yoast or Rank Math comes along: the title (with the variables this blog has), description, focus keyphrase, canonical address, noindex, sharing image and primary category.
- Scheduled posts stay scheduled. A sticky post has no equivalent here. Comments are not imported.
- Imported posts are not announced as new posts.
- A post this blog cannot save (a value over a limit, such as a translation's title) never stops the others: it is left out and named, in the preview or the result. So is one whose text would be over 200,000 characters once its links point here.
Photos
Photos are downloaded after the posts are in. You can leave the page while the import runs. A photo that cannot be fetched never stops the import:
- Photos that could not be fetched lists each one with the reason.
- Fetch again, from this address: if your old domain already points at this site, enter an address where the old site still answers (such as
old.example.com). The same file paths are used. - Upload a ZIP of photos: a ZIP of the old site's
wp-content/uploadsfolder, up to 180 MB each (one ZIP per year works well). Each missing photo is matched by its year, month and file name.
A post that already has a featured or sharing image keeps it.
Exporting
The Export tab counts the posts, categories, tags, authors and photos the file will hold. Published and scheduled posts only leaves drafts and archived posts out. Press Download the export file.
In WordPress:
- Set Settings → Permalinks to Post name: the links between the posts land on the right posts only then.
- Open Tools → Import and install and run the WordPress importer.
- Upload the file.
- Assign each author to an existing user, or let WordPress create them.
- Tick Download and import file attachments to copy the photos. WordPress fetches them from this site, so it must be online at its public address, on one of the standard web ports (80, 443 or 8080): WordPress fetches from no other. Without them, a post's featured image may point at nothing, or at an unrelated older photo; set it again in WordPress.
- Import the file once. Importing it again into the same WordPress adds the hidden data to its posts a second time: move the posts the first import made to WordPress's trash first.
The posts arrive as WordPress blocks, so they open in the block editor; what has no WordPress block (a checklist, a table with a caption) comes as a Custom HTML block. An address longer than WordPress keeps (about 33 Persian letters) is cut the way WordPress cuts it, and the links between the posts follow. Categories keep their tree. The SEO fields go as Yoast data; the sharing image goes as its link to this site. WordPress's Change all imported URLs option (on by default) moves links between the posts onto the WordPress site's addresses.
What WordPress cannot hold is listed with a count before the download: translations, second and later authors of a post, archived posts (they go as drafts), the review state, sharing images (their link keeps pointing here), author bios and photos, translations of categories and tags, and a canonical address on this site (it would send the moved post back here).
Coming back
The file keeps each post's identity in hidden fields WordPress stores. Export from WordPress (Tools → Export) and import that file here with Posts imported before: Update from the file: each post is recognised as the post it was, updated, never doubled, and keeps its authors, translations, review state, primary category and photos. Its text comes back as WordPress's blocks hold it: a list item or a table cell with two paragraphs has two lines instead, a table loses its column widths, and links and photos on this site point at this site again. Imported into another blog, the same file brings the translations, the primary category and the archived status.