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.


Media Categories 1.2, Now Supports Gallery Shortcode

A few months ago I received suggested it might be a good idea to allow the gallery shortcode to retrieve attachments from a category as part of my Media Categories plugin.

So here it is, Media Categories 1.2 extends the native WordPress Gallery Shortcode to allow you to select a category to display via a newly added ‘category’ parameter which can take either a term_id OR a slug.

[gallery category='slug']

Normally the gallery shortcode only shows you images that have been attached to the current post, or a post id passed as an argument. This normal behavior is preserved with Media Categories 1.2, however when invoking the ‘categories parameter, the current post is ignored, unless its id is explicitly passed.

[gallery category='slug' id='12']

In the example above, the gallery shortcode will create a gallery of any images that in the category called ‘slug’ AND are attached to post id 12. If the id is not explicitly passed, then it will simply return all images from the category.

As I’ve stated, if you don’t invoke the category parameter, the gallery shortcode will behave as normal, so this plugin will not interfere with how galleries already in use will behave.

I have a few additional updates coming soon for this plugin, per another request I received via the plugin directory forums, version 1.3 will include a filter so that developers can change the taxonomy at will.

Thanks for using the plugin, as always I appreciate bug reports and feature requests, I hope you find good use for this new feature.


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


Plugin Update: Category Template Hierarchy 1.3

Download Category Template Hierarchy Version 1.3 from the WordPress Plugin Repository

I’ve release an update to the Category Template Hierarchy plugin, a particular bug report prompted the update but there are a couple of other changes as well.

I use this plugin for three sites I’ve worked on for Sears / Kmart, so over time I make  minor changes to resolve issues I notice or improve how it works, but I don’t always have time to release those changes publicly.

A recent bug report forced to release a fix, and gave me an opportunity to update the plugin. Some of these changes effect how the plugin behaves, so it could impact your site if you depend on this plugin to keep your theme working. Here are the changes

  1. Improved performance be removing completely unnecessary logic to determine current category while building the list of potential templates to use. (No behavioral effect)
  2. Changed the filter used by the plugin. Before it used the very broad and general ‘template_redirect’ filter, but that caused obvious problem with other parts of the hierarchy, so not it uses the ‘category_template’.
  3. In addition to changing which filter is being used, the plugin used to `include()` the `get_query_template()` function, but now returns `locate_template`. This should resolve a bug where global variables such as $post were not available from within the loop.
  4. Logic in the `is_child_of_category()` and `is_parent_of_category()` has changed to check `!isset($child_category->parent) || !isset($parent_category)` instead of `empty($child_category) || empty($parent_category)`. This could effect your code if you use these conditional tags for anything in your theme.

The only item that does not effect any behavior is #1. Items #2 and #3 change the way the template hierarchy effect other parts of the native Template Hierarchy, so if you’ve seen strange behavior with non-category templates then you’ll definitely benefit from these changes. Item #4 is important as well, since it simply makes the conditional results much more accurate.

I don’t know how often people use the conditional functions, or how many of the couple thousand people who’ve downloaded this plugin actually use it at all – but I really appreciate the bug reports and any feedback. As I’ve said, I use these plugins myself on productions sites – so the public QA is always appreciated.

Download Category Template Hierarchy Version 1.3 from the WordPress Plugin Repository

Enjoy!


Incorrect Datetime Bug Plugin – WordPress

Download: WordPress Plugin Directory

This plugin was create to work around a problem that -I have to assume- only occurs after a database migration, where certain configurations in MySQL lead to several odd symtoms including but not limited to:

  • Loss of ability to create new posts
  • Loss of ability to update posts
  • Admin interface reverts to lowest settings such as the ‘Publish’ button says ‘Submit Draft’.
  • Errors regarding invalid timestamps
In addition, this problem is often accompanied by an error like the following:
WordPress database error: [Incorrect datetime value: ‘0000-00-00 00:00:00’ for column ‘post_date_gmt’ at row 1]

INSERT INTO `mg_posts` (`post_author`,`post_date`,`post_date_gmt`,`post_content`,`post_content_filtered`,`post_title`,`post_excerpt`,`post_status`,`post_type`,`comment_status`,`ping_status`,`post_password`,`post_name`,`to_ping`,`pinged`,`post_modified`,`post_modified_gmt`,`post_parent`,`menu_order`,`guid`) VALUES (‘1′,’2011-08-23 03:32:43′,’0000-00-00 00:00:00′,”,”,’Auto Draft’,”,’auto-draft’,’post’,’closed’,’open’,”,”,”,”,’2011-08-23 03:32:43′,’0000-00-00 00:00:00′,’0′,’0′,”)

The inability to pass zero dates breaks the ability to actually create a new post, but it also seems to have the odd secondary effect of confusing the heck out of nonces (noces are a security feature), probably because they too rely on timestamps.

This plugin strips out the sql_modes listed below from @@SESSION, thereby eliminating the problem while only effecting database sessions WordPress starts and not the whole database.

Explanation and history of the problem

The cause of this problem stems from an old (soon to be deprecated) odd behavior/feature of MySQL which WordPress came to depend on. My understanding is that it stems from problems in MySQL with regard to using the MySQL NOW() function in some contexts – so as a workaround it was decided that if a date of all zeros was entered on a column that was set as NOT NULL, then that date would not be rejected, but instead would be converted to the current date – to mimic NOW().

Subsequently this method was marginalized as generally a bad idea – and now values exist for a setting called sql_mode, which turn this behavior off and force errors when a null value is passed to a NOT NULL field. In many cases when there is an actual DBA in charge of the database, they will assign these values to the production database to force what outside of MySQL would be normal SQL behavior.

There are 3 sql_modes which will trigger the error by disabling the ability to enter zero dates.

  • NO_ZERO_DATE
  • NO_ZERO_IN_DATE
  • TRADITIONAL
It’s worth mentioning that the ALLOW_INVALID_DATES mode does NOT solve the problem, even though by the name of it, it would seem that it might.

The solution

This plugin solves the problem with minimal effect to the database environment. All this plugin does it check to see if the sql_modes in question are set, and if they are, it removes them.

Importantly, this plugin changes @@SESSION.sql_mode and not @@GLOBAL.sql_mode. By changing sql_mode via the session, it only takes effect on each specific connections WordPress makes with the database rather than changing it for the entire database permanently – as such this will have no effect whatsoever on any applications that might happen to be using the same database.

Other manifestations, alternative solutions.

WARNING: Whenever applicable, consult your DBA before making any changes to production databases.

This problem may (I have no idea) in fact be more common during installation. The errors are different, and although I have seen them, I do not have them handy at this time. In any case, if the sql_modes are set during installation – the process will fail from the start – because of this, it is my presumption that anyone encountering the errors as described above – has probably recently migrated to a new database, or perhaps recently acquired an enthusiastic new DBA who has made some changes.

This plugin DOES NOT FIX this problem for those encountering during installation – thats impossible because WordPress ignores all plugins during installation – so there is no way to hack around it via plugin and fix it before installation occurs.

If you are encountering this problem during installation you will need to find an alternative way to remove the modes. If this is a production environment this may require the cooperation of a DBA who may not like the idea. If met with resistance, I suggest the asking for the modes to be temporarily removed for installation, and then set back after its dont – at which point this plugin will handle the problem from then on.

If your encountering this locally, or on a environment whose database you have access to modify, you will want to make as few changes as possible, so go to whatever interface you use (command line, phpMyAdmin, whatever) and run this line of SQL:

SELECT @@GLOBAL.sql_mode;

This will show you all the sql modes currently defined. Copy all them them but if you have NO_ZERO_DATE, NO_ZERO_IN_DATE, or TRADITIONAL remove them. Then update sql_mode with the remaining modes as such:

SET @@GLOBAL.sql_mode = "STRICT_TRANS_TABLES,STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO";

Please don’t simply use the sql_mode definition I have shown above, this is only an example – be sure to use the modes from your database configuration. Remember to keep everything together NO SPACES ALLOWED in the definition.

Finally, if your just working locally and don’t care about these sql_modes, you can just clear them all.

SET @@GLOBAL.sql_mode = "";

This will do the trick but is absolutely not recommended as a fix for production sites that might share environments.

Irrelevant Note: I struggled with naming this plugin, and settled on the terminology seen in the error message.