Good Business Ethics

Good Business Ethics

Tired of the Woo drama? Then skip to this section.

Earlier this month WooThemes announced a price increase. For this they have been praised by some for ensuring “their sustainability” and “that their lifetime will be much longer than it would have been just days ago”. Some very high profile and well-respected developers also came out in support, to name but a few Carl Hanock,

Brian Krogsgard and Pippin Williamson (albeit with some reservations about how it was handled).

However the changes caused a furore among a vast majority of their customer base. While some were angered by the perceived opportunism, the main focus of customers’ anger was towards the following paragraph in WooThemes’ announcement:

Any purchase made before today will be grandfather-ed into the new system with access to support and updates for 2 years. All theme purchases will also now have a license, which you’ll be able to use with the WooThemes Updater once all themes have been updated.

That is the changes would be applied retrospectively: customers who had purchased a product (license) with the understanding it was unlimited with regard to both sites and duration were told that this would no longer be the case. This is compounded by the fact that the in the month preceding their changes, WooThemes ran a sale – pushing sales with conditions that would abruptly change.

As noted, however, there were some who backed the changes, pointing to the fact that if WooThemes didn’t survive, then the licenses would die anyway along with their product, and possibly even parent company. However, this potentially illegal1 and highly unpopular move forced caused such a stir that it forced WooThemes to backtrack and give customers the option of moving back to the terms they had agreed to.

Even then, you have to opt out of the new license conditions, which is dubious to say the least.

… but haven’t they got a point? What Carl says is entirely true:

A lot of businesses, making a lot of money (so we’re told) rely on WooThemes to exist and continue to provide updates and support for their products. But here’s my point: when a customer makes a purchase from you, it’s a promise. The customer pays you money, and in return you provide them the product, and any promises of updates and support that went with that purchase. In legal terms, it’s a contract.

If you’ve promised more than you can provide, then the company must bear the cost of that. The customer cannot be penalised for the mistakes the company made – that’s good business ethics.

Good Business Ethics

But I don’t want this article to be focussing on the bad. Because, at around the same time another WordPress company realised that their current business model wasn’t working. Like WooThemes they too had offered liftetime support and updates, and like WooThemes they realised that this wasn’t sustainable and needed to change. In fact, this change was the third in one year. The man behind this business admitted his mistakes, and corrected them without punishing existing customers.

In fact he went one step further. He even gave existing customers – regardless of which model was in use when they purchased the product – lifetime updates and support.

The company is Thomas Griffin Media, and the founder Thomas Griffin and the product, Soliloquy.

Thomas has written up an excellent summary of the four business models he experimented with, along with the reasoning behind the one he’s chosen to stick with. It’s an insightful analysis, but more importantly it’s a demonstration of how businesses can do the right thing.

At the heart of any business, including WooThemes, are people – who, like everyone, are prone to making mistakes. We need to bear that in mind, and have grace for that, and resist temptation to consider them faceless entities whose sole intention is to extract money from us. And it has been good to see – as I’m sure Adii will appreciate – customers stating they would be willing to pay more to see the business thrive.

But businesses though must recognise that their promises need to mean something and that they should, at the very least, treat customers fairly and honour the commitments they make. The burden of doing that cannot be imposed upon the customer.

As consumers in a relatively young, albeit fast growing, marketplace we have the opportunity to define the characteristics we want to see in businesses. Do we value low cost, or high quality products? Do we value established brands, or indie developers? Do we value profit-driven businesses, which are able to grow and invest? Personally, I think we should be encouraging characteristics such integrity, transparency and honesty in our businesses. These are not white elephants. They can be found in businesses of all sizes. And I urge you to promote such businesses.

  1. In UK law there is enough to suggest that courts would deem this ‘unfair’ and so illegal.‎. But it’s really South African Law that applies here. Nevertheless, I would be willing to bet it is in fact illegal. 

Event Organiser 1.6 – What’s New

1.6 is seeing a lot of improvement in terms of functionality – as well as some additional hooks and functions (documentation will follow 1.6 release). There are also some nagging bug fixes.

First things first..

Beta Testers…. please 🙂

Obviously I would like the release of 1.6 to go without hitch – so I have been, and will be, testing 1.6 before I release it. But the more testers – the more chance we have of catching any bugs. 1.6. is already pretty stable – so if you just want to take it for a spin then feel free – and please report any issues!

The beta version is available on GitHub (dev branch):

New Features

Multiple Venues On Maps

Venue maps can be produced in one of two ways:

  • via shortcodes in post/page/event content [eo_venue_map]
  • or via a function for use in templates (echo eo_get_venue_map();)

By default they use the current (in the Loop) event’s venue. But now you can have several locations on one map. With the shortcode use a comma delimited string:

 [eo_venue_map venue="london-eye,edinburgh-castle"]

With the function pass an array:

  echo eo_get_venue_map(array('london-eye','edinburgh-castle'));

As you may have noticed you can also have tooltips for venues which appear when you click the location. I talk about how to do this a little further down. Note that it doesn’t by default list upcoming events – but you can do this by using this script in your functions.php:

Extra Options For Venue Maps

The venue shortcode also supports the following attributes which are used to change the settings of the Google map:

  • zoomcontrol
  • rotatecontrol
  • pancontrol
  • overviewmapcontrol
  • streetviewcontrol
  • maptypecontrol
  • draggable
  • maptypeid – (e.g. ‘ROADMAP’, ‘SATELLITE’)

All but the last take true/false values and default to true. The last accepts a string (see Google map type IDs) and defaults to ‘ROADMAP’.

 [eo_venue_map venue="london-eye,edinburgh-castle" zoomcontrol=false]

With the function pass an array:

  echo eo_get_venue_map(array('london-eye','edinburgh-castle'),array('zoomcontrol'=>false));

Tooltips for Venue Maps

There is also ‘tooltip’ option (defaults to true) which displays a tooltip with the venue’s address.

The content of this tooltip is filterable using the hook eventorganiser_venue_tooltip.. So you can, for instance have a map with venues on it, and the tooltip for each venue lists (and links to) upcoming events at that venue.

 [eo_venue_map venue="london-eye,edinburgh-castle" tooltip=true]

With the function pass an array:

  echo eo_get_venue_map(array('london-eye','edinburgh-castle'),array('tooltip'=>true);

Extra Hooks

These will be documented shortly – feel free to poke me via twitter @stephenharris88 if I forget…

  • eventorganiser_event_color Filters an events colour (HEX code). This, for instance, allows you to colour events according to venue rather than category. See this post.
  • eventorganiser_calendar_event_link – allows you to replace or remove the link from the fullcalendar. See this post.
  • eventorganiser_event_tooltip – filtering the content of event tooltips on the fullcalendar. See this gist.
  • eventorganiser_fullcalendar_event – filters the entire event array before it is sent to the fullCalendar. This is an array that contains the event’s categories, venue, description, colour, dates etc.
  • eventorganiser_menu_position – change where EO appears in the admin menu (default: 5).
  • eventorganiser_widget_calendar_date_link – filters the widget calendar link. See this post.
  • eventorganiser_venue_tooltip – filters the tooltip for venues on venue map. See this gist

Create Venues On the Fly

There is now a ‘+’ button next to the Venue drop-down on the events admin page. Clicking this allows you to create a new venue for this event. The venue is created when the event is saved. A cancel button also appears when creating a new venue so that you can abandon that new venue and select a pre-existing one instead.

Widget Calendar Options

Aside from including/excluding past events, the Widget calendar has options to restrict the events it shows to certain categories or venues.

Improved UI

It won’t be long before WordPress ditches thickbox in core – so in EO I’ll be phasing out its use too. The admin calendar now uses jQuery UI Tabs and Dialogs – which I think looks a lot better. In case you’re wondering what the tabs are for – more tabs will be added by the booking add-on I’m creating. (More on that soon!).

More fullCalendar options

A massive thanks to Pascal Zerr who contributed this. The fullCalendar now accepts the following additional arguments (defaults are also given):

  • axisformat (default: ‘ga’ ) – time format displayed on the vertical axis of the agenda views
  • weekends (default: true’) – whether to include weekends in the calendar
  • mintime (default: 0′) – Determines the first hour/time that will be displayed, even when the scrollbars have been scrolled all the way up.
  • maxtime (default: 24′) – Determines the last hour/time that will be displayed, even when the scrollbars have been scrolled all the way down.
  • alldayslot (default: true’) – Determines if the “all-day” slot is displayed at the top of the calendar
  • alldaytext (default: __(‘All Day’,’eventorganiser’)) – Sets the text for the all day alot
  • columnformatmonth(default: ‘D’) – Determines format of the date in the column headers in month view
  • columnformatweek(default: ‘D n/j’) – Determines format of the date in the column headers in month view
  • columnformatday (default: ‘l n/j’) – Determines format of the date in the column headers in day view

Note that all date-time formats are in php format.

More tags for shortcode & event list widget ‘template’

You can now use %event_content% and %event_title_attr% and %event_duration% were added in previous versions. %event_excerpt% now takes an optional %event_excerpt{30}% (the excerpt length in words). Also%event_thumbnail%now accepts an additional second (optional) parameter: attributes (a string passed to get_post_thumbnail();

Improved Performance

1.6 removes some ‘dead wood’ from the database. Namely columns that have long been deprecated. The date columns are now indexed, which should improve performance of date based queries. Finally there’s been a bit of code refractoring to improve readability and performance. Javascript files have been ‘reshuffled’ and some code duplication removed.

As mentioned there have also been numerous bug fixes – including some styling issues on the front-end calendar and some ICS import issues. Even if you don’t need the above features, I recommend upgrading.

Event Organiser 1.5 – What’s New

1.5 adds some great, and much asked for, features – as well as fixing reported bugs. It’s currently in beta testing. Any volunteers for beta testing are very much welcome!. Please get in contact with me if you are interested.

What’s better:


1.5 sees a massive performance boost for the plug-in. This is a result of some reshuffling of how data is stored – but also due to caching calendars & widgets.


The plug-in now uses the jQuery UI theme being thrashed out here. While not yet ‘official’ this represents the closest thing to the WordPress UI – which means the plug-in looks much more like the Admin UI (though personally, I didn’t think the original theme was not far off…). An added bonus is that the jQuery UI theme used depends on the user’s theme settings (in case you use the ‘classic’ blue theme).

Public fullCalendar

The fullCalendar now looks a bit more like the admin calendar (which is much better in my opinion). I’m working on improving the category/venue filters for this calendar too.

Code base

Functions concerning updating, creating and deleting events has seen a major overhaul and will be accompanied by full documentation that allows third-party developers to extend the plug-in (for instance creating events on the ‘front end’). These will be added to the function reference.

Other functions have been added, and some deprecated (though not removed) – these deprecated functions are giving way to ‘better’ functions. For example the function eo_get_the_occurrences_of() replaces eo_get_the_occurrences() and returns an array of occurrences – each occurrence being an array of start/end DateTimes. eo_get_the_occurrences() just returned an array of start DateTimes.

Event Agenda

You can now group events by day or by month. You can also change the ‘grouping’ date format (this appears for each month / day) and the ‘event’ date format (appears for each event). Obviously for grouping by day, the grouping format should probably contain the date, and for grouping by month, it should contain the month.

There also improvements in how the agenda deals with events with long titles.

Event List

CSS classes (e.g. eo-event-venue-{venue-slug}) have been added to event lists. This will allow for styling according to category, venue, and whether the event has ‘past’, is running, or is in the future.

Permalink options

There is now separate event and archive permalink structure

Venue admin page

More of a bug fix, but the venue admin page now allows you to hide/minimize and move the metaboxes.

What’s New

Add / Remove arbitrary dates

A much requested feature was the ability to add events that reoccur, but not according to any schedule. 1.5 allows you to add or remove dates from the schedule. A ‘custom’ schedule option has been added (in effect this is essential a single-occurrence where dates have been added. All schedules allow dates to be added/removed, but they retain their original label ‘daily’,’weekly’, etc.

Tooltips for the fullCalendar

Another much requested feature. This can switched on/off for each individual calendar using the tooltip=true / tooltip=false attribute.

Adding time format option for admin calendar

The admin calendar now show 12 hour / 24 hour time. See the screen option (top right) on the Calendar admin page.

Added tag:

You can now use %event_duration{'format here'}% in the event list template (widget/shortcode). To display the event’s duration. The format can be anything from here.

Added functions

Here’s just a few of the functions which are being added. These are the result of a massive code tidy up, and although what they did occurred before 1.5 – these functions are now available for use by third-party plug-ins without fear of them disappearing.

  • eo_get_venue_map() returns the HTML for a venue’s map. Can be used within the loop without a parameter or by passing a venue ID (as an integer) or slug (as a string).
  • eo_insert_event($post_data,$event_data) – creates a post of type ‘event’ with occurrences generated from and schedule data given by $event_data.
  • eo_update_event($post_id, $event_data,$post_data) – update an event with ID $post_id.
  • eo_get_event_schedule($post_id) – get an event’s schedule data (schedule occurrence, frequency, start & end dates, included & excluded dates, all day or not etc)

and more!

Added hooks!

In line with my goal of trying to make Event Organiser malleable and extendable I’ll be introducing some actions and filters. These will be documented in the developer section of the plug-in website.

Other improvements

  • Various bug fixes (including for this bug with W3 Total Cache – thanks to Ben Huson for resolving this)
  • Metaboxes on the venue admin page are now moveable, hide-able and minimize-able.
  • Added in a ‘duration’ template tag (for use in the event list shortcode / widget),
  • Separate permalink structure for event archive and single event pages
  • Improved Agenda ‘cut off’ for title (if space doesn’t allow)

As previously mentioned, I’m still after beta testers – so feel free to volunteer :).