It might surprise you how infrequently I build WordPress sites intended for actual blogging. More often, I’m building 15- or 20-page websites for businesses who need a bunch of static content displayed in a variety of ways. Some of this can be accomplished with plugins, but the rest must be inserted in the post-edit screen, making things messy for the client:

That’s one big drawback to using WordPress as a CMS: the lack of custom content types/groups, an area where Expression Engine really shines. EE’s custom field system allows developers to put restrictions on how clients insert content. This keeps the content clean, portable and relatively unbreakable because all the structural HTML is tucked away in the templates themselves, not in the post-edit screen.
In this sense, WordPress is not quite a “full-fledged” CMS and developers must create workarounds.
Custom Code
Here’s a page from a recent WordPress project:
Notice the 6 thumbnails and excerpts in the left column. Any attempt by the client to add/edit that information could easily disrupt the HTML and potentially break the design:

Even if the visual editor was turned on, the client wouldn’t be able toor necessarily know how toproperly wrap those elements with the necessary HTML. And if the client tried to copy-paste content from another site, the visual editor would inherit that HTML, creating a jumble of inconsistent code.
Luckily in the case of Spring Creek, we ended up writing some special PHP mixed with custom fields and TimThumb to generate and format the content, but not every client can afford to pay for that kind of automated solution.
Content Chunks as “Pages”
Here’s another page from a recent project:
In the sidebar of each static page is a chunk of related content. One method we’ve tried in the past is breaking up sidebar content into separate Pages and using PHP to dynamically insert them wherever appropriate:

That keeps keeps the code cleaner, but unfortunately adds a layer of confusion for the client who must edit his Page content and Sidebar content in two different places.
The <!–nextpage–> Quicktag
So for VA Film, we decided another way to break the content into pieces without allowing the client access to any structural HTML was to deploy the nextpage function:
The sidebar content gets called from within the template, like this:
<div id="sidebar">
<?php if ($numpages > '1') { ?> <?php $temp_query = $wp_query; ?>
<?php query_posts('page_id='.$post->ID.'&page=2'); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="entry"> <?php the_content(); ?> </div>
<?php endwhile; endif; ?> <?php $wp_query = $temp_query; ?>
<?php } ?>
</div>
It’s still a hack, but it allows the client to edit primary content and sidebar content in the same place without inserting any extra <div>s. There are other useful hacks of the <!–nextpage–> function that I’ll write about again soon.
Widgets
The last obvious method would be to create multiple widgetized regions in your theme. This practice is becoming more common in themes like Thematic.
Unfortunately, while the concept of “widgets” might make sense to bloggers, it doesn’t always make sense to the business owner. And depending on the content, it may still require some HTML knowledge, for example: floating an image, inserting a list, or requiring certain <div>s:

Questions
Obviously none of these solutions is perfect. Static content can be displayed in a number of wayscolumns, quadrants, floats, listsbut the more ambitious it becomes, the less likely the client can edit it cleanly. In my experience, nothing compares to the rigid control offered by Expression Engine’s custom fields.
Final thoughts:
- What other ways can we prevent clients from breaking layouts?
- Should we design page content to be as simple and linear as possible to allow clients easier editability?
- Should we insist the client learn a bit about HTML before handing over the site?
- Should we write elegant hacks based strictly on how much money the client can spend?
- For larger sites with variable page layouts, should we just opt for a true CMS like Expression Engine instead? Should we not compare apples to oranges?



10:08 pm
This is one of the reasons I find Drupal so exciting. Like EE it’s really easy to create your own custom content types. But it is possible to create custom content types in WordPress.
10:26 pm
Great post, Darren. I agree that ExpressionEngine does a much better job on more complex sites where multiple content areas are required. Custom fields just don’t cut it in WordPress; they aren’t made for big chunks of content.
I’m still waiting for a plugin that lets you build your own write page – even if it’s just adding various text boxes. Maybe someone with a bit more PHP knowledge than I will eventually take a crack at it.
I still believe that WordPress is primarily a blogging platform (despite the recent movement to transform it into a CMS). You can hack it up all you want for yourself, but in the end, it usually doesn’t simplify things any more for the client. This is definitely something to experiment with.
10:30 pm
Flutter cms is an interesting solution.
12:11 am
@Ian wish Drupal was easier to use.
I need to learn EE.
12:13 am
Flutter has been frustrating for me – for as much as I want to love it, it’s still too quirky and reliant on other code. I’ve been making good headway with Henrik’s More Fields and even good stuff from WPgogo Custom Fields plugs.
Agreed that EE (along with so many more CMSs) simply do what a CMS is expected to do. However, I’ve noticed that I’ve spent almost equal time adjusting the backend of EE for the client, to the same amount of time actually building the site and adding content. WP usually is so much quicker for me to turn stuff on/off so the client doesn’t inadvertantly “wander” into places that might wreak havoc.
Cleaner still is Function’s Custom Write Panels post for the WP “do it yourselfer”.
3:50 am
I think that there should be a facility to add a new write page where you can choose custom fields and only make it available to one category.
This way you could have a property listings site and it’s a clear distinction between adding a property and adding news. This means there doesn’t need to be 1000 different plugins to cater for all the different industries as you can create your own.
Anyone know of any further development going on here?
9:15 am
WordPress as CMS for the Spring Creek site was exactly the right solution. The extra time spent to customize and ensure that the client (or their marketing firm) doesn’t break the design was necessary, appreciated and worth every penny.
11:19 am
Darren, I strongly recomend for similar cases the use of this plugin, its make things easer for developer and clients ;)
12:11 pm
i think,too..
2:21 pm
Something I’ve thought a decent amount about too. I know that Wordpress is a blogging system first, but it seems like they should recognize how many folks are using Wordpress as a CMS and find some solutions to the problems that it presents.
Looking forward to the new stable version of More Fields to allow for a bit more flexibility.
I’m also on the cusp of looking into EE as an option for my clients, but haven’t quite jumped in yet. I think its quite strange that EE doesn’t have page hierarchy at all, and achieving it seems to get rid of user friendliness (like having to change the date on a post to reorder them) Will try it out soon.
6:02 pm
@ian: I can’t tell if WPFun’s solution is more or less trouble than setting everything up custom in EE. I guess the main difference is that it feels more like an experiment to do it in WP (esp for a quantity of paid projects) whereas with EE, it’s using the software as it’s meant to be used. I struggle over that argument a lot.
@Dan, Kel, Chris: I’m going to play a bit with Flutter tomorrow. I like the solution from Function, but I need to get my head around it.
@Steven: In the past, I’ve used post categories to make my own little non-blog applications, like this portfolio page. But if a client needs more than 2-3 pages with custom data like that, I’m likely to recommend EE before the contract is signed.
@Marijean: I’m happy that you’re happy ;) You’re been an extremely cool and easy to client to work with, plus you give us cupcakes when we do a good job.
7:25 pm
@jesse and alessandro: thanks for the plugin recommendations.
Regarding the pages and menus in EE, it’s puzzling that really obvious stuff requires plugins instead of being part of the core, whereas in WP they’re handled pretty elegantly — seems like it should be the other way around. More proof that there are no silver bullets in the CMS world yet.
5:31 am
well well .. the Widget-based solutions looks much promising. The problem with HTML insertion could be avoided using a WYSIWYG-editor widget instead. Depending on the content, you could use said one or some simple input field, where no HTML input is required.
Some examples:
a) “About us-”page, introduction text – take the WYSIWYG widget
b) Some link to someplace else – take the simple “input field” widget
c) Need to enter a headline or title? “input field”
d) News page entry? Do it the WYSIWYG way!
Note: About half a year ago I worked with some folks who indeed use a CMS working the above described way. It’s used both for websites of big financial and churchly organisations.
cu, w0lf.
9:05 am
I tried hacking Wordpress to use as a CMS for a couple sites, and it was way more work than it was worth. Then I tried CMS Made Simple, and I have never been happier. I cannot recommend it enough.
1:19 pm
I’m surprised that you didn’t mention Custom Fields. I used them quite extensively on the StoryCorps website and it has worked very well. Between that and Improved Include Page, the whole site practically built itself! (I am totally exaggerating, but they are important tools)
The Wefunction website seems to be down now, I would love to see what these Custom Write Panels are all about.
6:03 am
Awesome..hopefully in future maybe WordPress will help to use static content and make it easier to use as CMS..:) Lovely work.
11:07 am
People have used wordpress as a CMS for a long time now, but creating a “special backend” (for those not so technical clients) with custom fields still is a big problem. There are a few plugins that help with that but the problem is far from resolved.
Using EE is a solution for some clients, but not for most of them. Maybe I should have a look at Drupal one more time.
Joomla will probably work as well but the back-end will scare any customer (even the brave ones! :) )
3:59 pm
@ Darren
If you are dealing with 10 or so different page types, who not use custom pages (templates) and call different page template from the write page. Any time you include inline HTML you are bound to have issues with users tweaking or worse breaking it. I am guilty of using inline HTML tags on my site, but my theme is designed for such abuse and I am aware of what I am dealing with, but it is unfair to expect clients to do the same.
6:55 pm
fwolf: those are good suggestions. We haven’t traditionally pushed the widget solution on clients, but would consider it if we found a foolproof way to make it easy.
@Cristi:
Have your clients had bad experiences with EE?
@Sonny:
If we received all the content upfront and could analyze how to lay it out and how to design custom templates accordingly, that might work fine. Unfortunately, the content never comes in time, and most clients don’t know how to design their own custom templates when the time comes. It’s the old chicken/egg debate.
12:17 pm
Hey, all of you!
I can only recommend Ryans simple CMS for the Back-End. It disables everything a client (user class below administrator) won´t need. Pretty nice sollution. But what i´m still searching for, is a widget closer to EE-custom fields. Hard to describe. we are trying to implement 4 widget regions that can be attached to a static page. the template contains only navi+subnavigation and the header. everything below should be “widgetized” so even the client can rebuild the whole homepage via drag&drop and easy text-editing and selecting images from his library/mediathek via drag&drop….
thanks if anyone answers on this and can provide some ideas.
3:51 am
What about this?
http://wpcandy.com/plugins/creating-custom-content-type-with-flutter-plugin.html