2022-02-15 08:00

On Migrating WordPress Content to Ghost

The problem: I want to migrate a few dozens of posts from my Numeric Citizen Blog to my other website, Numeric Citizen Introspection, hosted on Ghost. Easy, right? Think again. The Ghost migrator plugin doesn’t support posts selection; it’s an all or nothing tool. How can I migrate a subset of my posts in that context? By assigning a specific category to each post, I can use the WordPress export tool to export these posts. Next, those posts can then be imported into an empty WordPress instance. From there, I could use the Ghost Migrator plugin. The issue is that I don’t have an empty WordPress instance sitting idle. Using WordPress.com, I cannot install the plugin in a free instance (it’s part of a Business plan, which I subscribe to for my main blog). The solution, was to use my Synology NAS to install an empty WordPress instance locally and proceed from there. Let’s see what the workflow looks like.

  1. Turn off post update in the WP to Buffer Pro plugin to prevent flooding your Buffer queue
  2. On the source WordPress instance, update posts category that you want to export
  3. Install the Export media with selected content” plugin (which is needed to export images as well as text content)
  4. Export content to an XML file with the plugin
  5. Install WordPress on Synology NAS with all required dependancies
  6. Configure a WordPress website that will be used to host exported content in transit to Ghost
  7. Install Export media with selected content” in Synology WordPress instance (not really required)
  8. Install the Ghost Migrator plugin
  9. Delete the default post and unneeded page from the WordPress instance, as well as any images from the media library.
  10. For each post to export, add the export category of your choice (in my case it was PhotoLegend”.)
  11. Export posts using these options from the WordPress Tools menu
WordPress export with selected content plugin in action
  1. Switch to the WordPress instance running on the Synology NAS
  2. Select Import from the Tools menu
  3. Select the XML file created from the Export step earlier
  4. Set the author for the imported posts
WordPress import plugin in action
  1. Set the Download and import file attachments to bring in images
  2. Click Submit and wait for the process to complete (it takes some time, depending on the number of posts and images to import)
  3. Verify if all posts are listed in the Posts section (check creation date, author, etc.)
  4. Check for Media Library to verify if images are imported
  5. Open a few posts to see if content is correctly formatted
  6. Edit posts with back links or other elements that need to be updated before importing content into Ghost
  7. Edit tags according to the destination website requirements
  8. Edit post slug and post title according to destination website requirements
  9. Export using Ghost Migrator plugin, select the JSON format since ZipArchive module isn’t installed with this version of WordPress and PHP
Ghost Migrator plugin is pretty limited in functionality
  1. Import JSON file created in the previous step
  2. Check for imported posts issues. This is where I hit the wall. Missing photos, content imported as HTML blocs, etc. Not great at all.
Images are missing in imported post
Posts from WordPress are imported in HTML block in Ghost which is not good
  1. Turn back on the WP to Buffer Pro Post Update option

This workflow doesn’t meet the goal of migrating WordPress content to Ghost. I ended up deleting the posts on the source WordPress instance and kept a copy of them on my Synology instead. I don’t know what I’ll do eventually with these archived” posts.


Some observations are in order. This whole story brought many observations that I think you should consider if you’re attempting something similar.

  • The Ghost Migrator plugin is very limited, which make it hard to build an optimal migration workflow.
  • Images migration is close to impossible or very unreliable, forcing to use a manual export and import process.
  • Image optimization plugins on WordPress could make the migration harder than necessary.
  • Website optimization plugins on WordPress could add tags that are probably hindering the migration process.
  • Ghost import feature is still a work in progress can there is no way to select which post to import after reading the JSON file.
  • Testing the migration with a single post would most likely help identify issues faster, instead of importing all the content on the first try.
  • It doesn’t help to convert the WordPress post to use the block editor before exporting the content.
  • Migration efforts are time-consuming, making sure the content still has value to your reader is a good idea. I ended up deleting my 23 posts after spending hours of migration efforts. The positive side of this story is that I learned quite a lot.
  • Even if I couldn’t use the ZIP file for the Ghost Migrator plugin, I don’t think it would have made a difference in the migration quality. I tried to add ZIP Archive to the PHP installation, but the WordPress installation within my Synology NAS is hard to customize. After spending a few hours trying, I dropped the ball.
  • Data portability is really an issue these days. Even with export or import plugins exist, there are other problems that are inherent to each platform or CMS.

One thing that I gained from this experience is that by using WordPress on my Synology NAS, I can export content from my online WordPress to my Synology NAS for archiving purposes. That’s cool. Other than that, the problem of data mobility across content platform is real.

WordPress Ghost Service CMS Data Mobility

Previous post
My Blogger Workflow As of 2021-12 This Is My Blogger Workflow as of 2021-12
Next post
Proof of Concept With Craft My adventure with Blot may come to an end sooner than I thought