Lee Willis

October 30, 2014
by Lee

Default Lowest Shipping Choice on WP e-Commerce

The WP e-Commerce plugin no-longer defaults the cheapest shipping option at checkout. This can be great if you want customers to consider other shipping options that may be beneficial for them (For example quicker delivery, insurance etc.).

If you do want it to default to the cheapest option, try this simple plugin:

WP e-Commerce Default Lowest Shipping Choice
by Lee Willis

A straightforward plugin that makes WP e-Commerce checkout default to the lowest available rate when first populatingshipping choices.

The plugin’s available for forking and contribution over on GitHub


  • Current version: 1.2
  • Downloaded 34 times

October 28, 2014
by Lee

Change order of payment gateways in Easy Digital Downloads

Easy Digital Downloads lets you enable multiple payment gateways to give customers a choice about how they want to pay. The core plugin also lets you choose a default option, but it doesn’t let you choose the order that options are presented at checkout. That can lead to odd UX where the default selected option appears second, or third in the list:

Screenshot from 2014-10-28 22:10:46

Fortunately, it’s pretty easy to change this order – simply paste the following function into your theme’s functions.php file, or use a functionality plugin. Just change the $gateway_order array to the gateways you have enabled, in the order you want them, and you’re good to go.

function lw_edd_enabled_payment_gateways($gateways) {
	$gateway_order = array(
	$new_gateways = array();
	foreach ( $gateway_order as $gateway ) {
		if ( ! empty( $gateways[$gateway] ) ) {
			$new_gateways[$gateway] = $gateways[$gateway];
	return $new_gateways;

Here’s what our revised default checkout looks like – much neater.
Screenshot from 2014-10-28 22:15:48

April 2, 2014
by Lee


One of my colleagues made a comment the other day.

You must get a lot of karma for all of these patches you send…

I found this quite interesting. I’ve always been a fan (In a non-religious sense) of the concept of karma. Google helpfully provided this definition:

The sum of a person’s actions in this and previous states of existence, viewed as deciding their fate in future existences.

For me – I’ve always believed that if you have good intentions, and treat people well, then that will be rewarded.

My father-in-law has studied behaviour extensively, and I’ve had many a conversation with him about psychology, and behaviours. I recall a long conversation about altruism (doing good things for others motivated not by personal gain), and while I’m sure many people see Open Source in general as altruistic. For me though, that’s not the case.

So, what about me and Open Source. A brief history:

  • I first encountered Open Source in University. One of my classmates was a Debian Maintainer and introduced me to it. I was immediately in love with the concept. Not because it was free (as in $0) – but because it was open. I could change, extend and fix it if I needed to.
  • I got involved in WordPress when I built a site for my wife.
  • Then I built a second site for a family member. Encountering a number of bugs in the plugins I was using, I got involved in patching them. I didn’t want to have the hassle of continually applying those fixes – so I submitted them back to the project. Since this wasn’t a paid project, this also seemed like a good way of giving back (good karma – right?), so I made sure to make any fixes I made be useful in the general sense rather than just for me, and off they went.
  • I also spent time in the support forums identifying other issues and trying to provide fixes for them. After all I knew I would be called upon if any problems happened, so it made sense to me to head them off at the pass.
  • Shortly afterwards I started selling WordPress plugins. I’ve always tried to make sure that some of the time I spend “doing that” (it’s not my day-job) is spent giving back to free projects, such as plugins I’m extending, or WordPress core itself.

So, I love Open Source because it’s open and I can change, bend it, fix it, improve it. That’s empowering.

I contribute to Open Source because it makes my life easier to do that than the alternative. That’s hardly the “altruistic” angle that people often spout about Open Source (Geeks building stuff for free), but it’s honest.

April 1, 2014
by Lee

Sort variations by price in Easy Digital Downloads

A discussion with my two children about pocket money gave me a real life reminder about the concept of anchoring.

Since my new WordPress plugin store has only recently gone live, and I’m still firmly in the tinkering / tweaking / post go-live phase I thought I’d a bit of experimenting with anchoring in the context of licence pricing.

I currently sell three different licence options, the options look like this:


I wondered if anchoring might affect people’s perception of value both in terms of overall conversion, and/or upsell from single licence purchases to multi-site licences. So I figured I’d swap the variations around – showing the most expensive option first, and pre-selecting it. In a future experiment I’ll also probably experiment with pre-selecting the middle-price option, or the cheapest while maintaining the order.

My new store uses the Easy Digital Downloads plugin, and fortunately it’s full of handy hooks and filters that let you change default behaviour. So  here’s a short snippet that you can drop in your theme’s functions.php, or a standalone plugin. It will order your variations by price, highest price first.

 * Custom usort() callback that sorts on the "amount" within the array principally, falling back to "name" if required.
 * @param  array  $a  The first value to compare.
 * @param  array  $b  The first value to compare.
 * @return int        -1 if $a should be sorted before $b, 1 otherwise.
function pblw_edd_purchase_variable_prices_sort( $a, $b ) {
        if ( $a['amount'] == $b['amount'] ) {
                return $a['name'] > $b['name'] ? -1 : 1;
        return $a['amount'] > $b['amount'] ? -1 : 1;

 * Sort the variations so that the most expensive is presented first.
 * @param  array  $prices       Array of variations available for purchase.
 * @param  int    $download_id  The download that the variations belong to.
 * @return array                The modified list of variations, sorted on price descending.
function pblw_edd_purchase_variable_prices( $prices, $download_id ) {
        usort( $prices, 'pblw_edd_purchase_variable_prices_sort' );
        return $prices;
add_filter( 'edd_purchase_variable_prices', 'pblw_edd_purchase_variable_prices', 10, 2 );

The end result looks like this:


I don’t expect that I’ll be able to generate any hugely statistically significant data from this experiment – but I’ll try and revisit it in a month or two and let you know how I get on!


March 26, 2014
by Lee


Scope is an interesting thing.

Scope discussions are unavoidable.

If you’re building something for yourself, that leads to some interesting situations – you’re torn, and because it’s an argument with yourself there’s never going to be a clear winner.

So – I thought I’d write up some thoughts on my recent store rebuild as much to reflect on as document the decisions I’d made along the way. When I set out I had some clear objectives of what I wanted to achieve:

  1. Move to a sales solution that was focussed on digital products
  2. Re-design the store to take into account some lessons learned
  3. Less custom functionality – more off-the-shelf
  4. Re-work product copy – make it easier for customers to understand plugin functionality and how it can help them
  5. Liven up product images – make it more obvious what is for sale

The honest answer is that I’ve hit 3 and 2 halves of my objectives.

So – my new plugin store is now live – what did I achieve?

Well, [1] was a no brainer, and were pretty much achieved before I started. I decided to move to Easy Digital Downloads as the base software for my store. [3] also got closed off pretty quickly with with the addition of EDD’s Software Licensing extension, reviews add-on and Stripe gateway.

Item [2] was also reasonably straightforward. I went for an off-the-shelf theme (Humbleshop), and after a couple of aborted colour schemes – I settled on the Rocket colour scheme to provide the feel for the theme.

The last two items are where I compromised.

People often talk about not compromising, but I’ve always been more of a pragmatist, than an idealist. I also think that experience has made me a reasonable judge of what a reasonable trade-off point is [your opinion may vary!].

Before we go any further though, I’d like to note that this isn’t about being lazy or impatient – this is about scope, and managing it. It’s about delivering, and iterating. So here’s what happened…

For [4] I’d intending reviewing all of my product and support copy – with the help of Hemingway App. For [5] I was undecided on whether I was going to commission artwork or some other solution.

Aware that if I was going to commission artwork it would have a leadtime this was the item I looked at first. I had a few chats with some friends who’ve worked with designers on icon / logo design before and it quickly became clear that for the volume of artwork I needed, the costs were going to put me significantly out of budget.

My previous site didn’t have any product icons at all, only screenshots. So my compromise was to produce icon / logo based product images that represented the plugins on offer. You can see the results here. I’m classing this as a half-achieved objective since it’s definitely an improvement on the previous version – but I appreciate it could be a lot better if I had the money, or the design skills to spend on it.

Pragmatism – see?

So – we’re left with [4]. I started this, and re-worked several pages of product copy, but I’ll confess I shifted focus, and just left some of the rest as-is. The reason was that I identified other items that needed doing that I viewed as more important. Rather than extend the project, I decided to just swap those activities. The current product copy isn’t “broken”. It sells. I’m sure it could sell more, but I’m not losing anything by leaving it as is.

The activities I swapped it with either prevented the experience being broken , or added value. So here’s what I did instead:

  • I decided to migrate purchase history, rather than just licences. Pippin Williamson flagged that not migrating purchases for existing licences might cause issues for renewals / not-yet registered licences. My customers don’t deserve that.
  • I decided to work on creating some widgets I could use around my site to make access to information clearer and more discoverable.
  • I decided to work on a way of better structuring my support materials. This improves the product pages on day 1 – but also gives me a better foundation for when I do do the content reviews.

Overall – I’m happy with the result. Those “compromise” items haven’t been forgotten about or dropped – they’ve just been moved into a post go-live list.

Of course, I’ll update this series as it happens – feel free to remind me if you don’t see anything more :)

February 25, 2014
by Lee

Designing the plugin store

As I hinted at the end of my last post, probably the final step of pre-planning my new plugin store was to think about theme choice for the new store. I’m no designer myself, so a self-build theme is mostly out of the question. Neither am I at the level where I’d consider a bespoke theme development to be required, which leaves me with customising an off-the-shelf theme – an activity I’m perfectly comfortable with.

The problem is…

Most (e-Commerce) themes is that they’re designed to show off the products in the best light possible, and as a result they tend to be image heavy. This is an approach that really doesn’t work well if you’re selling code. Currently my store relies on screenshots on products.

While I think this is really useful in terms of people understanding the functionality available in the plugin, it’s not great for people navigating the store, or “selling” people on the product. So – I’ve decided I need product “icons” of some form.

I’ve not yet decided what they’ll be, or how complex they’ll be. My design skills might stretch that far, or I may be looking for an illustrator who can help me out – but I’m not yet convinced that’s what will be required. 

Choosing a theme

As part of my original research on this project, I’d looked closely at WP e-Commerce, and WooCommerce – both of which have a broad selection of lovely looking themes. Discounting the really image heavy themes there’s still a great deal to choose from.

Since I settled on Easy Digital Downloads, and because it’s not a plugin I’ve spent a lot of time theming, I really wanted something that worked out-of-the box. Unfortunately, while there are a couple of nice themes, there’s not really as broad a choice as there is with other plugins – I think this is the only area I’d score the plugin down in. 

I settled on a shortlist though:

Forelight is great, and would be fantastic for someone selling digital art or similar, but I felt it relied too much on imagery. Quota and Shop Front also got discounted as great as they are, they were a bit too plain. I thought I’d have too much design to do to make them feel polished. In the end, I settled on HumbleShop (Be careful, there’s a normal, and an EDD version of the theme available on the net – make sure you grab the right one).

Aside from throwing a few warnings during installation, I’m pretty happy with this choice so far. As you’d expect from someone who tinkers a lot, I expect I’m going to be throwing a few improvement patches the authors way – we’ll see how that goes. However – first impressions are that it’s going to deliver the sort of experience I’m looking for.

Styling it up

Of course, I won’t be leaving HumbleShop as-is. I’ve created a child theme already and have started playing around with styling and colour schemes. I’ve been browsing colourlovers.com for colourscheme inspiration. Again I had a shortlist (Higher, Wordofmouse & Worf, Winter Olympics, and Breakfast Berries), but after a discussion with some trusted friends – I settled on Wordofmouse & Worf:

Color by COLOURlovers

Actually – when I say “settled” on – that might not be entirely true – after applying it to HumbleShop, I’m not quite sure it works, so it may be back to the drawing board. We’ll see…

February 24, 2014
by Lee
1 Comment

To sell direct, or not?

My recent blogging revival, kicked off by my plans to re-build my plugin store has led to some really interesting discussions on various topics. I guess that’s definitely a plus-point of taking the time to write up my thoughts.

One question I got asked on Twitter was definitely too difficult to answer in 140 characters:

The discussion related to my WooCommerce plugins, some of which are sold directly on my own site, and others which are sold through WooThemes. I admit that I don’t have a hard and fast set of rules which make the decision for me, but the list below gives some of  the factors I consider.

Note: While this is written mainly about selling through WooThemes vs. selling on your own store, many of these apply equally to any other non-direct sales channel.

1. Product similarity

One of the main considerations is the availability of similar products. For example, one of my most popular plugins is my WP e-Commerce Premium Shipping plugin. When I considered porting this to WooCommerce, I reviewed what was already available through WooThemes. Sure enough – WooThemes already sell their Table Rate shipping plugin which covers roughly the same set of features.

It takes a different approach, and the functionality isn’t a 100% match though. Being a believer in healthy competition, I decided that this wasn’t reason enough to not port the plugin to WooCommerce. However I didn’t think it would really make sense for both of those to be available in the same place – it would muddy the water too much – so I sell it myself, through my own store.

 2. Pricing

WooThemes (just like any other marketplace) take a percentage of sales made through WooThemes.com. For simple, or smaller plugins this can puts quite a lot of pressure on the selling price. For some of my plugins, I simply feel that a marked up price would make the plugin too expensive if sold through WooThemes.

3. Likely support overhead

As part of the WooThemes extension agreement, WooThemes provide first line support. If your extension is likely to have issues with badly coded themes, or is likely to raise many questions, then having a team available for support can be a great thing.

4. Eggs in baskets

As the expression goes: “Don’t put all of your eggs in one basket” :)

5. Customer ownership

Building up a list of customers allows you to market to them on an ongoing basis, cross-sells, up-sells, product updates etc.

If you sell through a third party marketplace, you might not have that opportunity, and you may be relying on the marketplace to market effectively to their customers on your behalf to drive further sales.

6. Route to market

For me, one of the biggest advantage to selling plugins through WooThemes is that they are a great route to market. If you’re a WooCommerce user, it’s likely to be one of the first stops when trying to find suitable plugins. Not selling through a well-known marketplace (whether that’s WooThemes, the EDD extension store, CodeCanyon or similar) means you have to build your own reputation, work on your own SEO, and driving your own customers.

If you’ve read my planning post, then you’ll know that I’m keen to maintain good schema.org markup, and existing review data. Hopefully you now know one of the reasons why …

7. Supporting the community

WooCommerce is a free plugin. I’d like to think that the money that WooThemes earn on the commission on premium plugins goes some way to supporting the ongoing development of WooCommerce – something that’s in extension developers’ interests.

Hopefully that provides some information on what I consider when deciding where to sell plugins.

February 21, 2014
by Lee

Moving to EDD – Qualification & planning

Once I’d decided on Easy Digital Downloads for my plugins store, the first step was to work out which components of my current / desired setup would be covered by EDD core, which by EDD extensions, and which would be bespoke. From there I could plan properly what work was required.

One of the key reasons I’d settled on EDD was the Software Licensing extension. It’s one of the bigger areas of bespoke code in my current solution and one which causes me a reasonably high maintenance overhead. There’s a couple of aspects of my current system that aren’t in the current extension, but Pippin Williamson did a great job of covering off the few questions I did have about the functionality with a speedy, and well-considered response in their support forums. I’m sure that any bits I really miss I’ll be able to add on, and hopefully commit back.

I’m also grabbing the Review extension. Again, I don’t think it does everything I want out of the box, but the one or two features that I’ll miss I’m confident I can add on. Since the EDD team had a discount for multiple purchases I’ve also been swayed into grabbing the Stripe extension – I’ve been happily using PayPal for the past three years, but I’d like to give another options since not everyone likes PayPal (or gets confused about how to pay via card).

After the initial investigation was done I set about working out some key tasks would be required.

The big thing that became obvious was data migration. I already have a reasonable body of (positive!) reviews on my plugins, and I want to maintain them across the transition. The bigger job, however will probably be the licensing changeover. Not only will I have to migrate existing licence codes into the new plugin, but I’ll also need to make sure that existing deployed plugins can be transitioned smoothly.

Here’s the main list of jobs I identified:

Solution needed for product documentation

My current site has an entirely bespoke setup for linking documentation posts to products. It’s not huge, but does involve a variety of query hijacking that really shouldn’t be necessary. For the new site I’m planning on basing the end-solution off the excellent “posts to posts” plugin by @scribu. I’ve already got a simple proof-of-concept up and running, and this is one area that might make its way out as a plugin in its own right – more in a future post.

Legacy upgrade provider

I need to provide a wrapper around EDDs licensing system to handle existing deployed plugins asking for updates, so that they can transition to the new version.

Licence migration script

I need to migrate all of my existing licenses into EDD. Pippin helpfully provided some outline info about how this could be achieved, so I’m happy it won’t be too much of a drag.

Review migration script

I need to make sure that all product reviews get migrated across, and that the schema.org markup is as I want it. Again the EDD team helpfully answered my pre-sales questions about migrating the data and how easy or otherwise it could be.

GA Tracking in EDD licensing

After an interesting issue in the past I’ve discovered it’s important to monitor the health and activity of services that happen behind the scenes. My current licensing system feeds information into Google Analytics so I can track licence request volumes, and activity to spot any problems early. I’m planning on porting this in some form into the EDD licensing plugin, or as an add-on to it.

Re-write product copy

My product copy is a bit dry, and lacking. I’m planning on running all copy through Hemingway to improve its readability, as well as updating all screenshots, and looking into getting some proper product icons sorted out (Still a bit undecided on the approach here).

Mailing provider

I currently use Campaign Monitor for handling mailing lists, as well as Sales follow up emails. They have a great service, but MailChimp offer some other features (Such as e-Commerce tracking) that are making me consider moving. Another job to be evaluated at some point.

In summary, this won’t be an overnight job, and there’s a lot of testing to do, not to mention the actual re-design …

Easy Digital Downloads

February 20, 2014
by Lee

Moving to EDD

As some of you may know, I offer commercial WordPress plugins over at plugins.leewillis.co.uk. I started the store back in April 2011, and at the time the only real e-Commerce solution for WordPress was WP e-Commerce. My store’s run rock solidly on WP e-Commerce for the past 3 years, and I’ve constantly been impressed by the core team’s ability to manage the complexity of supporting legacy features, installs and themes.

Scratching my own itches building, and running my store served admirably as a source of ideas for many of my free, and paid-for extensions. However, for the last 6 months or so, I’ve been planning a bit of a spring clean. A redesign was on the cards, and there were a few things I’d implemented that have worked OK, but could do with a second iteration and a bit of clearing up – particularly the documentation areas and the product information sections.

There’s a fair amount of bespoke code behind the current solution, from the licensing engine, documentation architecture, and a few other handy tools I use to handle support efficiently. When I talked at WordCamp London in November, hopefully I was clear that I’m a big fan of not re-inventing the wheel. So, I took the opportunity to review what was out there that would allow me to minimize bespoke code.

While I still think WP e-Commerce is a great solution for a lot of stores, it seemed overkill for my own requirements. Fortunately one of the plugins to have arrived in the last few years is targeted specifically at digital products. Easy Digital Downloads also provides some great add-ons that are going to help me minimise the amount of custom code powering my store.

So, with a bit of a heavy heart, I’ve decided to move my store over to Easy Digital Downloads.

I’ll certainly still be working with WP e-Commerce regularly (Actually, I’m looking forward to some changes with the store freeing up a bit more of my time to help out again!), not to mention WooCommerce, but I have to say I’m a little bit excited to spend a little bit more time with EDD.

Addendum: I’ve realised how infrequently I actually use WordPress for blogging, so I’m going to use this exercise to make me blog a little more. I’ll be covering the process, the extensions I’m using, and hopefully also any shareable code that comes out of the process – watch this space …

 Disclaimer: The easy digital downloads links in this post include an affiliate code.