Moving content from one platform to another isn’t easy. And it shouldn’t be that way.

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.

12. Switch to the WordPress instance running on the Synology NAS
13. Select Import from the Tools menu
14. Select the XML file created from the Export step earlier
15. Set the author for the imported posts

WordPress import plugin in action.

16. Set the Download and import file attachments to bring in images
17. Click Submit and wait for the process to complete (it takes some time, depending on the number of posts and images to import)
18. Verify if all posts are listed in the Posts section (check creation date, author, etc.)
19. Check for Media Library to verify if images are imported
20. Open a few posts to see if content is correctly formatted
21. Edit posts with back links or other elements that need to be updated before importing content into Ghost
22. Edit tags according to the destination website requirements
23. Edit post slug and post title according to destination website requirements
24. 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.

25. Import JSON file created in the previous step
26. 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.

27. 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.

Observations

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.