Imagine a very simple blog. Blog posts are just a title and a paragraph or three. In that case, having a CMS where you enter the title and those paragraphs and hit publish is perfect. Perhaps some metadata like the date and author come along for the ride. I’m gonna stick my neck out here and say that title-and-content fields only is a CMS anti-pattern. It’s powerful in its flexibility but causes long-term pain in lack of control through abstraction.
Let’s not have a conversation about CMS’s as a whole though, let’s scope this down to just that content area issue.
Now imagine we have a site with a bit more variety. We’re trying to use our CMS to build all sorts of pages. Perhaps some of it is bloggish. Some of it more like landing pages. These pages are constructed from chunks of text but also different components. Maps! Sliders! Advertising! Pull quotes!
Here are four different examples, so you can see exactly what I mean:
I bet that kind of thing looks familiar.
You can absolutely pull this off by putting all those blocks into a single content field. Hey, it’s just HTML! Put the HTML you need for all these blocks right into that content field and it’ll do what you want.
There’s a couple of significant problems with this:
Not everyone is super handy with HTML. You might be setting up a CMS for other people to use who are great with content but not so much with code. Even for those folks who are comfortable with HTML, this doesn’t leverage the CMS very well. It would be a lot easier, for example, to rearrange a page by dragging and dropping then it could carefully copy and pasting HTML.
The HTML-in-the-database issue. So you have five pages with an image slider. The slider requires some specific, nested, structured HTML. Are you dropping that into five different pages? That slider is bound to change, and you’ll want to avoid changing it five times. Keep your HTML in templates, and data in databases.
So… what do we do? I wasn’t really sure how CMS’s were handling this, to be honest. So I looked around. This is what I’ve found.
In our blog template, the body of the post is just one big area to add text. Your editor, however, might want to build up a post with images, or video, or anything else. We can give them the ability to choose between different things to put into their post using Perch Blocks.
The Replicator is a meta fieldtype giving you the ability to define sets of fields that you can dynamically piece together in whatever order and arrangement you imagine.
It’s tempting to just shout out Advanced Custom Fields here, which seems right up this alley. I love ACF, but I don’t think it’s quite the same here. While you can create new custom fields to use, it’s then on you to ask for that data and output it in templates in a special way. It’s not a way of handling the existing content blocks.
There is also the forthcoming Gutenberg editor. It’s destined for WordPress core, but for now it’s a plugin. Brian Jackson has a good article covering it. In the demo content of Gutenberg itself it explains it well:
The goal of this new editor is to make adding rich content to WordPress simple and enjoyable. This whole post is composed of pieces of content – somewhat similar to LEGO bricks – that you can move around an interact with. Move your cursor around and you’ll notice differnet blocks light up with outlines and arrows. Press the arrows to reposition blocks quickly, whichout fearing about losing things in the process of copying and pasting.
Instead of putting all their content in one WYSIWYG body field including images and videos, end-users can now choose on-the-fly between pre-defined Paragraph Types independent from one another. Paragraph Types can be anything you want from a simple text block or image to a complex and configurable slideshow.
The Modular Content principle means that you break up your content into smaller pieces of content, that can be used or parsed separately. So instead of a single blob of content, you may set a headline, an image and a text description.
Each of those small blocks of content have their own template so you can do amazing things with their values.
Of course those aren’t the only CMS’s on the block. How does yours handle it?