Blending Custom Post Types and Custom Taxonomies

In the past I’ve mentioned a very complex plugin named “WidgetPress”, which I built and is the underlying foundation of the Sears Community and Kmart Community sites. What WidgetPress does is complex, and the short time I had did not allow me to really clean it up the way I would have liked to. This is why I have not released it publicly.

However, the lessons learned from WidgetPress are many, and some of the ideas and solutions that led to its completion can be feathered out of the bulky plugin into their own stand-alone plugins. Thats exactly what I am trying to do now. The specific functionality I’m working on right now is the idea of using custom post types and taxonomies in such a way that they are no longer independent. It will take some explaining to show how this is useful  so I will start by explaining how it is used in WidgetPress.

WidgetPress, at the end of the day just lets admin’s create “Section Fronts” based on category or a Page – define their layout, and drop widgets into them to determine the entire contents of that layout. The widgets themselves make up as much of the page as the theme developer likes – for our purposes, everything between the top navigation and the button navigation is entirely composed of widgets on almost every single page on the site.

For WidgetPress to work, I actually had to completely deconstruct and reengineer the way WordPress handles widgets internally. I completely bypass WP_Widget_Factory, I ignore all those horrible global arrays, and hijack the whole widget registration process. I built my own entire structure for handling widgets, while still allowing (most) normal WordPress widgets to function without a hitch. I could write a whole book about the reasons I had to rebuilt all this but I’ll skip that. In my implementation Widgets are actually a post type, and sidebars are constructed using a custom post type AND a custom taxonomy working together – not in the typical way posts and categories work together – instead the post type and taxonomy function as a single entity. When an admin creates a sidebar, in the background it creates a new post of that post type, and a new term for that taxonomy.

The flexibility this allows is not immediately obvious. Widgets being a post type mean that they exist independent of their actual sidebar. Sidebars being a taxonomy means widgets can be placed into any number of sidebars, and sidebars can be associated with any number of “Pages”, “Posts” or other post types registered for that taxonomy. Sidebars, being a taxonomy and a post type, means that although they are used primarily as a taxonomy – each term can actually store meta data! This is the functionality that today I am building into a separate component.

The project I’m doing this is completely different from WidgetPress, its actually for an in-house products plugin – the intention being that any bit of data about each product can easily be made to be meta data and/or a taxonomy term.

The working name for this is WP_Node. I realize “node” has all sorts of existing meanings and connotations. However, given the way this merges content and relationships, blending them into a single idea – I find it difficult to think of a term that fits it better while remaining as abstract as it should be.

Hopefully in the coming months I’ll be able to release WP_Node (or whatever I end up calling it), as an independent library or plugin. There are also several other very interesting things I’d like to pull out of WidgetPress – maybe at the end of all this I can rebuild WidgetPress using the separate components (each of which will be better thought out and better written).

Advertisements

Sears Community & Kmart Community Launched

For the last few months I’ve been neglecting this blog and my publicly available plugins. Thats because 200% of my time has been tied of in this very large projects – the mySears Community and myKmart Community for Sears Holdings Corporation. This matching pair of Q&A style customer service sites have been migrated from a third-party host known as Viewpoints, and onto a self-hosted WordPress Multi-Site installation.

Today I’m happy to say that we’ve launched both.

While I’ve taken part in countless migrations to WordPress from other systems, including one from Viewpoints – this project was truely like no other – not only in the number of hours worked, but also in its technical challenges. Due to fuzzy requirements at the start of the project, the end product turned out different from what we expected on day 1 of development. If I were able to solution this project over again knowing what I know now, I would have chosen a much simpler approach. However it resulted in the development of some very interesting tools.

Of the parts I got to work on, there are 3 plugins that I’m proud of and that I think will be useful to the WordPress community – Custom Comment Type, Section Fronts, and WidgetPress. I won’t go into too much detail in this post, but heres a brief description of those three.

  • Custom Comment Type – create Custom Commeny Types much the same way developers already create Custom Post Types.
  • Section Fronts – A custom post type called ‘section’ that can be chosen to represent a category, post type archive, or even an intersection between the two. Similar to the way admins can already select a ‘page’ to represent the front page.
  • WidgetPress – A layout management tool based on the existing Widgets API infrastructure. Overhauled to work off two custom post types and a custom taxonomy – sidebars (referred to as dropzones) can be sized and created on the fly on a page-by-page basis leveraging a css grid framework on the front end. This – especially when used in conjunction with Section Fronts – has by far the greatest potential to make an impact, and opens up a whole host of possibiities for how WordPress is used.

I’ll try to write more about each plugin in the weeks to come. For now, none of them are clean enough for me to release them publicly. I’d like the opportunity to rewrite each one from scratch and do things the right way now that I know how it all needs to work – but I dont think I’ll have that much time so I’ll have to settle for something in the middle.

I’ll also throw up some screenshots for some of these, and at some point I’ll probably create a demo video of WidgetPress in action.


Kmart BirthdayClub Launch

Yesterday we launched a huge update and redesign of the Kmart BirthdayClub website for Sears Holdings. Not only does the new theme look a lot better, the content is much better organized, and its more usable that it previously was – both from an end-user perspective, and from a content management perspective.

Kmart BirthdayClub was originally migrated to WordPress approximately 7 months ago from its previous static and flash-based templates hosted on a WebSphere platform. The site attracted a decent amount of traffic and so some additions were made. The existing theme however was ill-equipped to handle the various new sections of content. The new theme solves most of the usability and information architecture problems that were present in the previous theme, looks a lot better, and leverages jQuery and CSS3 features like gradients, and box shadows to avoid unnecessary flash elements and imagery.

Like other sites I’ve worked on for Sears Holdings – FitStudio Gear, the Kmart Fashion Blog, and the Kmart Fashion Lookbooks – BirthdayClub makes use of my own Category Template Hierarchy plugin to modify WordPress’ native Template Hierarchy, allowing us to create specific templates for child categories. Every time I work with one of my own plugins I learn a little more about how to improve them, and that plugin – along with Media Categories – is due for an update soon.

Development for this project actually concluded a couple of months ago, but the launch date was repeatedly pushed back due to business constraints – much to the chagrin of Jason Corradino, who worked on the social media aspects of this project with me and wrote his own blog post about it long ago. He’s been eagerly waiting to publish it since we finished work  – unlike me, who lazily waited until last night  to write this, only once I realized we were really going to launch this time. 🙂