Move from WordPress
Bring a WordPress site's pages, posts, categories, tags, menus and media into a Goodfellow site, from its export file or its address, or move a Goodfellow site to WordPress.
A WordPress site can be brought into a Goodfellow site: its pages, posts, categories, tags, menus and media, with WordPress's blocks turned into Goodfellow's and old addresses kept or sent on to the new ones. You can do it in the admin panel, or from the command line, which also copies the media.
Nothing changes on the WordPress site, and you can keep it running until the new site is ready.
Where to import from
- An export file, which brings the most. In WordPress, go to Tools → Export, choose All content and click Download Export File. It has every page and post, their categories and tags, and the menus.
- The site's address, such as
example.org. Goodfellow reads what the site shows its visitors through WordPress's API, so it brings published pages and posts, but not menus, which WordPress only shows to people who are signed in.
In the admin panel
- Go to Site Settings → WordPress.
- Choose the export file, or type the site's address and click Read the site.
- Check what will come across: how many pages and posts, where the posts will be, which of the site's pages will be replaced, and anything that couldn't come across as it was.
- Click Import. Goodfellow copies the media, then publishes everything in one go.
Most WordPress sites don't let other websites download their files, and a browser can only copy media from those that do. Media that can't be copied stays where it is: pages show it from the WordPress site, and the import lists it, so you can upload it on the Media screen before you turn the WordPress site off. Importing from the command line copies every file.
On a full-stack Next.js site, only owners can import, since an import changes Site Settings and menus too.
From the command line
In the site's folder:
npx goodfellow import wordpress wordpress-export.xml
npx goodfellow import wordpress example.orgA Next.js site uses npx goodfellow-next import wordpress the same way. Either writes the files into content/ and public/media/, which you then publish by committing them. --dry-run says what would come across and changes nothing.
A new site can start from a WordPress site straight away:
npm create goodfellow@latest my-site -- --wordpress wordpress-export.xmlFrom the command line, JPEG photos lose the details hidden in them, such as where they were taken, as uploads in the admin panel do, unless those details are what turn the photo the right way up. SVG images aren't copied, since only the admin panel can check them for anything that could run code; upload them on the Media screen. Files over 25 MB, the upload limit, aren't copied either.
What comes across
- Pages keep their addresses, such as
/about/staff, with their titles as their headings. A page at an address Goodfellow uses itself, such as/admin, gets one of its own. - WordPress's blocks become Goodfellow's built-in ones: headings, text with its lists, quotes, links and formatting, images with their captions and descriptions, galleries, columns, buttons, YouTube and Vimeo videos and video files, sound files, files with their download buttons, code, preformatted text and verse, pullquotes, tables, details, separators, media and text, page lists, spacers, and covers as sections with their picture behind them, with the cover's color over it, its height and its focal point. Reusable blocks are put in place. Classic pages, written before WordPress had blocks, come across too, with their captions and galleries.
- Posts become a collection of Markdown items, with their dates, featured images, summaries, categories and tags. Where WordPress's addresses for them can stay as they are, such as
/my-postor/blog/my-post, they do; addresses with dates in them, such as/2026/06/my-post, can't be a collection's addresses, so posts move to/news/my-post(or/posts/where the site already uses/news/), and their old addresses send visitors on. - The list of posts goes on WordPress's own page for posts, such as
/news. Without one, it goes where the posts' addresses start, such as/blog, or on the home page. It has a page for each category, and WordPress's category and tag archives, such as/category/events, send visitors there. - Scheduled posts stay scheduled, and appear when WordPress would have published them.
- Menus become the site's menus: the main menu (the one named like "Primary" or "Main", or else the longest), the footer's, and others by name. Menus go two levels deep, so deeper items join their top-level item's list. Without menus, such as from a site's address, the main menu lists the top-level pages.
- The site's name and tagline become its title and description in Site Settings.
- Media that the pages and posts use is copied into the media library, once, whatever size of it they showed. Files that nothing uses aren't copied.
- Links to the WordPress site's pages and posts get their new addresses. Links to anything that wasn't imported, such as a draft, still go to the WordPress site, and the import lists them.
What doesn't come across
- Drafts, private pages and posts, and the trash.
- Comments, which need a server.
- Other kinds of content, such as products or events from a plugin. The import names them.
- What plugins do. Shortcodes, such as a contact form's, only work in WordPress, so they're left out, and the import lists the pages they were on, so you can put a Form block where a form was. Blocks from other plugins come across as their text and pictures.
- Tables' formatting. Table blocks' cells hold plain text, so links and bold in a page's tables are left out. Tables in posts keep them.
- Videos in posts, which become links to them, since Markdown shows videos as links.
- The theme. The site keeps its own colors, fonts and layout.
After importing
Check the pages the import lists, then:
- Upload any media it couldn't copy, and add descriptions to images that have none.
- Put a Form block wherever a form was left out.
- Set the site's address in Site Settings → General, then point the domain at the new site. The redirects keep old links working.
- Keep the WordPress site until you're happy with the new one.
Importing again brings the site across again, replacing the pages and posts at the same addresses, and copies its media again, as new files. Version history keeps everything it replaced.
Moving to WordPress
A Goodfellow site can go to WordPress too, as a WordPress export file, so choosing Goodfellow never locks a site in. The export is also a copy of the site that any WordPress site can read.
- Set the site's address in Site Settings → General, if it hasn't one, since WordPress copies the media from it.
- Go to Site Settings → WordPress and click Download the export file, or run
npx goodfellow export wordpressin the site's folder (npx goodfellow-next export wordpressfor a Next.js site), which writes a file named after the site, or the file you name after it. - In WordPress, go to Tools → Import → WordPress, install the importer if it asks, and choose the file.
- Tick Download and import file attachments, which copies the media library from the Goodfellow site, and click Submit.
What goes across:
- Pages keep their addresses, such as
/about/staff, with their place under other pages. The home page is a page called "home", which you can make WordPress's home page in Settings → Reading. - Blocks become WordPress's own: headings, text with its lists and links, images with their captions, galleries, buttons, columns and rows, sections with a picture behind them as covers, with their color over it, height and focal point, YouTube and Vimeo videos and video files, sound files, files, code, preformatted text and verse, pullquotes, tables, details, separators, media and text, page lists, spaces, contact details as text, and collection lists as a list of the latest posts. A page's first heading is left out when it's the page's title, since WordPress's themes show the title.
- Items of collections with pages become posts, with their dates, summaries, first images as featured images and text, each collection a category and its tags and choices as tags. Scheduled items stay scheduled, and ones their schedule has hidden again become drafts.
- Menus go across with their links, which point at the pages and posts they went to.
- Media: every file in the media library, which WordPress copies from the site's address.
What doesn't:
- Blocks WordPress has nothing like, such as forms, calendars, search and the dark mode switch. The export lists the pages they were on, so you can use a plugin in their place.
- Collections without pages of their own, such as a list of staff, since WordPress's posts each have a page.
- The header and footer, and the theme. WordPress's theme shows its own, with the menus.
- Redirects, which WordPress needs a plugin for. The export says how many there are, and they're in
content/redirects.json. - Blocks from block registries, apart from what's in their slots.