Ghost CMS vs WordPress: Detailed Functionality Comparison and Overview

14 min read

This article is trying to compare two leading world CMS platforms. This is not ChatGPT-generated content, but an honest opinion from a user and developer point of view. We hope the information in this article will be helpful for those of you who are making important decisions about an online platform for your businesses. The article will be updated over time.

Dashboard

Serves as an overview of email analytics and revenue from subscribers. Additionally, it shows the number of members, both paid and free. There is no data about website traffic; some people may expect the dashboard to display this kind of information, but it does not. The dashboard is not customizable.

Ghost CMS native dashboard

Wordpress Dashboard
The WordPress Dashboard is customizable and can display many widgets. Widgets can be developed or installed by different plugins. The dashboard also shows necessary messages about the system, such as updates. Unfortunately, it is often polluted by "call-to-action" messages from different plugins, but this is an issue only in installations relying on many plugins.

Wordpress basic dashboard

View site

Serves to display the website's appearance. No extra features included.

Explore - handy Ghost directory for your website

Ghost's native directory of Ghost websites. Any publication can be added there directly from this settings. 

Your website will be publicly listed with a short description and logo on this URL: https://ghost.org/explore/

Posts

Shows list of drafts, published, scheduled posts, etc. This post feed works as an endless scroll; there is no possibility to jump to page 50, for example. You need to scroll or filter posts to find it. Fortunately Ghost provide extensive filtering options.

Post filtering - by draft, published, email only, scheduled and featured

Post filtering - by access
Posts can be filtered by access type: Public, Members, and Paid members. However, the possibility to filter by each tier is missing.

Post filtering - by authors

Post filtering - by tags

Post filtering - by time

Post searching
Posts, pages, and tags can be searched by the native search in Ghost admin, but the search looks in titles, excerpts, and slugs. It does not search in content. You can't search by month-year.

Comparison with Wordpress
WordPress posts support paging, so there is no endless scroll. You can filter by month and year, filter by category, and search can execute only on posts, looking at the title, excerpt, and even the content of the posts. Filter by Authors is missing in Wordpress, but like everything in Wordpress world, this feature can be added by plugin or custom code.

Wordpress post feed

Ghost admin sidebar - custom items, media library, custom post types

Ghost does not allow new items to be added to the sidebar in the admin area, with one exception: custom tag filters. However, this is only valid for Posts, not for Pages. Users can make custom post tag filters available in the sidebar with a custom name and color. This topic is highly connected with several other frequently requested features:

Where is the media library?!
Can we create a custom post type?! We need to manage events and testimonials out of blog posts!

The answer is simple: no, you can’t. WordPress has supported this feature for a long time, but it is not possible in Ghost. Posts can only be divided by using the tag system. The missing media library is quite a PITA. We can only hope that Ghost v6 will bring this necessary feature.

Ghost CMS - custom post tag filters in sidebar

How does it look in Wordpress world
Unlike Ghost, the WordPress sidebar can be extensively customizable. We can have distinct areas for managing different data types, like "Events" or "Testimonials." Additionally, we can hide unnecessary items like "Comments" if you don't want to use them. Media library for managing uploaded image is handy. To be honest every CMS support this feature, but Ghost doesn't 🤷 .

The disadvantage in Wordpress world is that many plugins add their own settings to the sidebar, so a basic WordPress instance can become polluted with many options, which can become messy for users. So again, don't install too much plugins.

Wordpress sidebar showing custom post type "Developers" and native feature "Media" for image management.

Pages

Pages are used for content that does not belong to a specific topic collection. They are typically used for creating "About", "Contact", and similar standalone pages that doesn't belong into a collection.

In essence, they are the same as Posts but are not part of any tag collection. There is one limitation: unlike Posts, Pages in Ghost can't have advanced URL structures. For example, if you want to show a "Team" page under "About Us" with the URL "mydomain.com/about-us/team," you are out of luck. Each page can only be available at a single level, like "mydomain.com/about-us" or "mydomain.com/contact."

Can we create an advanced URL structure in Ghost? Fortunately, we can, but it is not easily manageable from the Ghost CMS. Ghost supports a routing file, which is a text file in YAML or JSON format that needs to be edited to achieve advanced routing. This is usually done by a theme developer, as it is not very intuitive for ordinary users.

Posts also follow a very basic URL structure, and this can't be changed in Ghost CMS, only via the routes file. The advantage is that posts can be mapped to different URL structures using tags. Pages do not have this ability.

Ghost CMS page management

How does it look like in Wordpress?
WordPress also supports the creation of Pages. A standard Page is displayed at the first level of the URL structure, for example, "mydomain.com/about-us". Unlike Ghost, WordPress supports hierarchical page structures, allowing us to define that a certain Page is a child of another Page. In such cases, we can build advanced URL structures directly from the CMS.
In the following example, we have defined that the About-Us page is the main parent, with the Team Page as its children. The Team Page then has two other children called John Doe and Jane Doe. The URL structure for John Doe looks like this: "mydomain.com/about-us/team-page/john-doe/".

Wordpress Pages - displaying Page hiearchy defined directly in CMS

Tags & Categories

In the WordPress world, we have Categories and Tags. Categories in WordPress are hierarchical, allowing us to specify subcategories of categories. Ghost supports only Tags. Tags in Ghost can be differentiated into 2 types: Public tags and Internal tags.

Public Tags:
Every tag added to a Post automatically creates a collection (archive) of all posts tagged by this tag on this URL "mydomain.com/tag/name-of-tag". Ghost does not support tag hierarchy, so the order of tags does not matter. The only exception is the first tag which is called Primary. This tag is always unique among all posts because it occupies the first position. So, it is often used for main content categorization.

Internal Tags:
Internal tags start with the "#" hash sign. An internal tag is not publicly visible and does not create a post collection on any URL. Internal tags are often used for technical-specific setups in Ghost. For example, we might add an internal hashtag called #center-title. Every post with this tag might support specific CSS styling, in this case, creating centered titles on the post template. This feature depend on theme implementation, every theme can support internal tags differently.

Ghost CMS - tag management
Wordpress- categories overview

Tag editing
Each tag in Ghost can have a name, slug, color, image, and description. Additionally, Ghost supports metadata editing on each tag for search engines and the open graph protocol for social media sharing. Ghost supports a complete SEO package for any data type, whether it's a post, page, or tag. This is a huge advantage compared to WordPress, as WordPress does not come with advanced SEO setup for data types. However, with plugins or custom code, it can achieve similar functionality as well.

Ghost CMS - tag setup


Category hiearchy
WordPress lacks extensive SEO fields in the category or tag setup, there is only name, slug and description, but it supports category hierarchy. For example, we've created a Parent Category "Podcast" with 2 children: "Lex Fridman" & "Michael Shermer". This creates URLs like

"mydomain.com/category/podcast/michael-shermer/"
"mydomain.com/category/podcast/lex-fridman/"


Both Lex and Michel have their own categories for their respective podcasts, and they are both displayed under the parent category "Podcast".

Wordpress - hiearchical categories

You might ask, "Can we achieve a similar URL structure in Ghost?" Yes, we can, but not via the CMS. As you already know, we have to edit the routes.yaml file and reupload the edited one into Ghost CMS. This is working routes.yaml file.

routes:

collections:
  /podcast/lex-fridman/:
    permalink: /podcast/lex-fridman/{slug}/
    template: index
    filter: primary_tag:podcast+tag:[lex]+tag:-[michael]

  /podcast/michael-shermer/:
    permalink: /podcast/michael-shermer/{slug}/
    template: index
    filter: primary_tag:podcast+tag:-[lex]+tag:[michael]

  /:
    permalink: /{slug}/
    template: index

taxonomies:
  tag: /tag/{slug}/
  author: /author/{slug}/

We are telling Ghost, that each post with Primary tag "Podcast" and tag "lex", should appear in:
"mydomain.com/podcast/lex-fridman"

Each post with Primary tag "Podcast" and tag "michael", should appear in:
"mydomain.com/podcast/michael-shermer"

Both of them appear under:
"mydomain.com/tag/podcast/

Editors in Ghost have to follow strict post tagging rules to achieve correct URL mapping. This is how the situation looks in the sidebar in post editing. Notice how we have to keep the first tag (primary tag) as Podcast, followed by Lex or Michael.

Bulk Tag/Category edit

If you need to move posts from one tag to another in Ghost, you will have to do it manually for each post. There is no bulk edit feature in Ghost v5.

WordPress supports bulk post editing, allowing us to select all posts and move them to a different category or tag in one action.

Members

Members is a Ghost-specific feature. Ghost supports collecting members' emails and information by default. Members can subscribe to customizable paid tiers for recurring subscriptions. This is a huge advantage of Ghost. The owner of a Ghost website can decide which posts or pages are accessible to different members.

Any post can be:

  • Public - that means that even non-members can visit content.
  • Members only - Only registered, signed-in members can access the content.
  • Paid-members only - Only members with an active subscription can access the content.
  • Specific tier(s) - We can manage access by specific tiers as well
Members list in Ghost CMS

WordPress does not include advanced member management by default, but like everything in the WordPress world, it can be done through custom coding or, preferably, by using a reliable membership plugin such as https://paidmembershipspro.com. It has extensive capabilities, but it is not the only option. The WordPress ecosystem is vast, allowing everyone to choose what best fits their business model.

Screenshot of the Members List in Paid Memberships Pro including the custom member roles for membership level "Premium"
Paid MemberShip PRO - Wordpress plugin

Can we set more advanced rules for post access?

What if we need to limit a certain tier by the number of readings per month? Can Ghost support this?

Since Ghost theme developers can't include advanced server-side logic in templates and lack access to the Ghost database, we're left with workarounds. In this case, we can use cookies or HTML storage in the browser to count read articles and limit users on the front-end. However, this solution is not ideal—such limits can be easily bypassed by resetting browser cache or changing browsers.

A better solution would be to store data in an external database paired with signed in user. The theme would need to support querying the number of reads saved in the external storage and updating this number directly from the front-end. This solution might work, but it requires implementing a third-party server (like a Cloudflare worker) as a proxy, as we don't want to reveal security keys on the front-end.

Members - what data can be collected?

Not much—just the name and email. Ghost supports another feature called member labels. It is a tagging system that works only for members and can be used to segment users for newsletters. We use this feature to mark members with their country code. Our client then sends different newsletters to different countries.

You might ask, "But we need more info, like a phone number or shipping address. Can we add a new field to members to collect such info?" No, we can't. Ghost does not support adding custom fields. In such cases, creative workarounds must be implemented. We usually collect extra info in a different database outside of Ghost. It's not very pleasant.

We also often use an extra field called "Note," which is available in every member's data. The problem is that standard subscription forms do not allow writing extra info into this field. We usually have to use the Ghost Admin API to write into this field, often from an external proxy server. So again, it's not a super intuitive flow.

Content Creation - Ghost vs Wordpress

Ghost has awesome editor called "Koenig". You can try it yourself on standalone URL here https://koenig.ghost.org/

It supports many handy cards(widgets). Subjective experience is very neat, it does not stand in your way most of time. You are free to include titles, paragraphs, images, galleries (1 gallery can contain only 9 images, but you can have more galleries in post).

Buttons, headers, videos, sound files, file downloads, dividers, toggles, product cards, custom HTML code, etc.

Overall, the editor is nice, but has a few limitations. One of them is you can only build content in one long column. You can actually see it in this article. Yep just a long column.

If you're looking for more interesting layouts, you're out of luck. You can solve this by inserting custom HTML code using an HTML card, but from our experience, not everybody wants to write custom HTML. Ghost does not support adding new custom cards(widgets) by developers.

Another lacking feature is using custom fields. You will often find yourself in need of adding just a small extra piece of information. For example, imagine you want to make a post tagged "Event". An event usually has a date in the future. You can't just add a custom field called "Event_date" in the post. In an ideal scenario, you would like to show events in chronological order, ordering events that happen earlier before those later. Such info should be stored somewhere in the database, but it is not possible.

Let's look into Wordpress world
WordPress has supported the "classic editor" for many years. Then they added custom fields and custom post types, and WordPress became a full-fledged CMS. Much later, the WordPress team added the "Gutenberg editor". Gutenberg is not just for writing; it serves as a full website builder tool.
Nowadays, entire websites can be built just by dragging and dropping different Gutenberg blocks on the canvas. Developers can create own blocks using React(Javascript Library) or other methods like using plugin called ACF(Advanced custom fields). This plugin allow developers to write Gutenberg blocks using PHP language and classic HTML.
Thanks to Gutenberg, website owners have amazing freedom in layout building or even building entire websites, without relying on help from WordPress experts.

ACF | Getting Started with ACF
Wordpress - classic editor with custom fields
WordPress Gutenberg: A Beginner's Guide to the Cutting-Edge Block Editor
Wordpress - Gutenberg Editor

Comments - Ghost vs Wordpress

Ghost added support for native comments. It looks nice and works as you would expect. But we have a few small complaints. Ghost CMS does not show a list of all comments added on your website. This obviously makes things less manageable, especially when you forget under what post a user commented. You will just receive an email notification that a new comment appeared under some post.

WordPress shows a list of all comments in one place, and you can also edit comments before they appear on the website.

Newsletters

Ghost supports sending newsletters directly from Ghost CMS. You can build a post as usual and decide to publish and send it to subscribers, or you can just send it via email. This is an awesome feature supported natively by Ghost.

Ghost PRO users get this feature by default, while self-hosters have to connect their Ghost with the Mailgun API (a service for bulk email sending). Prices of Mailgun can be quite high for self-hosters, but Mailgun supports "pay as you go" pricing. That means you can send 1000 emails per month for free, then you pay $1 for another extra 1000 emails. You will not find this offer easily, you have to subscribe for trial and before trial expiration downgrade, then Mailgun switch your account to "pay as you go".

You might ask, "well why not to use different email provider?"
Ghost v5 support only Mailgun for bulk email sending. There were plans to include more providers, but we are still waiting.

WordPress does not support newsletters natively. You have to rely on external providers like Mailchimp, or you can install a plugin to solve this issue. For example https://wordpress.org/plugins/newsletter/

Another differences and surprises

Ghost supports editing navigations, including primary and secondary navigations. This is a very important feature, as you can always add pages, posts, or external URLs to your navigations. Limitations are that you can't add 3rd one. You can "hardcode" extra navigation into theme, but it is not ideal.

Another limitation is that you can't build multilevel navigations. This feature is often requested, and many Ghost developers come up with workarounds. These workarounds usually rely on hardcoding static navigation into the theme or, better yet, using custom JavaScript code to generate multilevel navigation from the default navigation. Ghost owners usually have to adopt new rules on how to write parent -> children items in the navigation editor.

WordPress supports as many navigations as you want. Multilevel navigations are not an issue either. It usually depends on the theme being used, but there are no limits.

To sum it up

This article is in a work-in-progress state. There are many differences that could and should be addressed. If we can give you some advice what is best fit for you and your business, answer is: It depends. I know not super helpful.

Wordpress is beast, it can serve for any type of business, from mom and pop shops to biggest e-commerce and media houses.
Admin UI is often perceived as old and ugly, yes it shows its oldness (Wordpress is working on more modern alternative).

Plugins are amazing but in the same time dangerous. Relying on many plugins can introduce security holes in your wordpress website. Plugins often pollute Wordpress admin with many bothering call to action messages asking for upgrading to commercial version of particular plugin.

Wordpress is friendly platform for developers, because it support adding very custom logic anywhere in Wordpress.

Ghost is lightweight Wordpress competitor. UI is modern and people like it. Support many features by default, but can't be extended if you need something more. Ghost is amazing for content creators, who prefer nice writing experience, and don't want to tune up their website, beyond Ghost native features.

Hello 👋

If you have any questions or need help with your project, please don't hesitate to contact us!

 
 
 
 
CZ
EN
EN