Ah the EU. Always with their bright ideas. If you haven’t heard about the upcoming changes surrounding EU VAT, first off, where have you been hiding?
To put it simply, essentially they require everyone selling digital products to customers in the EU to charge EU Tax based on the customer location, regardless of where your business is based. You can read more about the changes in the blog post I wrote on WooThemes.com here.
Being based in the UK, and selling plugins on WPJobManager.com, I am affected by these changes and so I’ve been doing a lot of research, speaking to accountants, and preparing my site for the changes.
In this post I’ll explain what I’m doing and hopefully this may give you some ideas/resources if you’re struggling with compliance.
Download Monitor is old. Around 8 years old in fact and was one of the first plugins I made for WordPress, back in the time before custom post types and all the other luxuries developers enjoy today.
It has been rewritten 4 times, seen well over 100 releases, and been downloaded 600,000 times. The latest ‘v1’ reboot has been praised and I often receive nice comments from users even though development has slowed of late.
But but therein lies the problem; time. The biggest, most exciting projects I’m working on (WP Job Manager, and WooCommerce at Woothemes) take up most of my time, so without sleeping at my desk I don’t have sufficient time to maintain and grow the plugin.
So rather than let it die a slow and neglected death, I’ve taken the difficult decision to abandon the project.
But Don’t Worry, It’s Being Adopted
Developer Barry Kooij (previously with Yoast and now a coworker at Woo) will be taking over the development of the plugin going forward.
The repositories have been transfered and work has already begun on the next version, so it looks like the plugin will be going for a few more years after all. Good luck to him!
With Download Monitor off of my plate, I can now focus on my other projects which are really taking off in a big way and demanding more of my focus. I’m really excited about it’s future, and I’m happy that Download Monitor is in safe hands.
I’m happy to announce I’ve finally flipped the switch on WPJobManager.com, a site which I’ve been working on for a few months now in my spare time. I felt it was about time that I had a better sales platform and a dedicated place for the plugin which has been steadily growing in popularity during the past year.
Up until now I’ve been selling add-ons via Gumroad. It’s a fun service, and it’s easy to use, but it lacks the flexibility I need. In particular I’m talking about licences. Without some kind of licencing system I have no way to verify a customer when it comes to updates and support, the sale is one off (something that’s not sustainable with this type of product), and I have no way to limit distribution of my plugins.
Therefore, I made the decision to switch over to WooCommerce (what else?) and have a proper marketplace for the plugin. Hosted on DigitalOcean and powered by WordPress and WooCommerce, WPJobManager.com is now live.
Keeping on top of the blogging was sometimes difficult, but got easier towards the middle as I got into a routine. Towards the end the difficulty increased again as I ran out of interesting topics to cover, but I got there in the end.
Building plugins is fun, especially the smaller ones. Today I thought it would be a good challenge to build one whilst documenting the process; I’m actually writing this post as I plan and build the plugin itself with the hope of having it finished by the end of the day.
What am I building? A small post-series plugin so I can group all of my #WTBFB posts and allow navigation between them on my blog.
Love it or hate it, if you make plugins and want any amount of exposure you are going to need to use WordPress.org – the exposure it provides (so your plugin is searchable via the WP dashboard), and the convenience of it’s plugin updates, make it necessary.
I don’t dislike WordPress.org, but there are several aspects I’d love to see improved and made customisable. Here’s my wishlist.
Before you release your plugin on WordPress.org it’s always good to spend a little time polishing the final product; not only does this make your job easier in the long run (so you don’t have to fix it later), it gives a better first impression to new users.
With 2013 drawing to an end, it’s time to start thinking about the upcoming year and what I hope to accomplish. I didn’t set any resolutions for 2013, but this year I want to set myself some goals so I have something to work towards. Here are my four new year resolutions.
Mike, one thing that strikes me about WC as compared to WP is stability of maintstay features and code structures. Notice that WP rarely breaks a site.
He went on to compare WordPress to WooCommerce:
This is something all the devs of WC should take careful note of. As a glaring example, WC 2.1 will break a lot of plugins. I know this to be fact our company has developed dozens upon dozens of custom plugins for WC for our customers.
Jonathan’s personal feeling was that plugins should avoid change. His main gripe was our ‘restructuring’ of core classes.
But it’s simply an ideological / philosophical tree structure decision that makes no difference in the overall operation of the software
Yes, we could have left them as they were and not much would change operationally. But the old structure was a mess and inflexible.
To explain a little, we had a classes folder, function files willy nilly, a separate admin folder with more classes inside etc. Anyone coming into WC development would see this and think “WTF are these jokers doing?”.
So yes, whilst we could have left them alone, we changed them – this will improve the plugin structure long-term, even if that means breaking some things short-term (note however: we didn’t envision this particular change could break anything).
Jonathan’s argument stemmed from the fact WordPress doesn’t break things often. But remember it still does.
Take MP6 for example; 3.8 changed the look and feel of WordPress admin, as a result styling in many plugins has been “broken”, including menu icons. Now, albeit not a site-breaking change, it means all < 3.8 plugins will need to make some visual alterations.
And what about the major updates 1.0 -> 2.0, 2.0 -> 3.0 – I’m certain plugins built for 2.0 would fail for 3.0, so why would WooCommerce 1.0 to 2.0 be any different? You shouldn’t expect your code to work forever.
Why changes are important
Whether they be features, refactors, or file structure changes, changes are important. Without making these decisions your plugin cannot evolve – you don’t want to be stuck with a v1.0 forever. It’s natural for things to crop up after the first release and after some real-world usage. Users will find bugs, oversights, or simply won’t be able to work with the plugin as they want to. Thats why you need to make the hard decisions for the greater good.
I can give you an example of a plugin-breaking change in WooCommerce. The order system in WooCommerce 1.0.x used post meta to store line items. This worked perfectly fine but with real-world usage it meant:
queries of line items were extremely heavy
serialisation of data was slow
the system was inflexible
a slight error in line item data would break all lines
So we created a custom table in 2.0 to store line items and the system is now way more stable. This change would have broken any plugin using those old meta fields directly, but it was necessary.
If you don’t improve, someone else will
You need to keep up to date with new features and enhancements. If you don’t someone else will, either with a fork or with a new competing plugin. Let us take an eCommmerce plugin example.
WordPress 3.0 “Thelonious Monk”, was released June 17, 2010 with the revolutionary new ‘custom post types’ feature.
Shopp, one of the biggest eCommerce plugins at the time, up to then was using its own custom tables and UI for products simply because no other core alternative was available.
It took 2 years for Shopp to support custom post types (Feb, 2012) and in that time countless new eCommerce plugins were released; WooCommerce, Jigoshop, eShop, Marketpress to name a few. Shopp had to lose many users over this, an example in their comments:
Too late for me. I wish you guys all the luck as you were there when I needed you years ago, but I’ve been seeing other shopping carts and they are getting all the future love.
See my point? I’m sure a large factor in this delay was the fear of change and backwards compatibility, but sometimes you’ve just got to say “screw it” and get the ball rolling before its too late.
What plugin developers should do
Keep backwards compatibility if possible
If its possible to keep backwards compatibility, even for a few releases, you should. Use deprecated functions, fallbacks, and output warnings. Production sites shouldn’t break and shouldn’t show these, but development sites will and developers will be able to get their customisations updated before the site falls over.
Only make major changes in major releases
Don’t make site-breaking changes in minor releases – that would would be irresponsible. If you have to change a fundamental part of your plugin, ensure its a major release with an obvious major version update.
It’s no good changing something un-announced and watching the havoc unfold; notify your users.
Blog posts, dedicated development blogs, in-plugin warnings and notifications, an ‘upgrade notice’ in your readme – all good ways of notifying your users. As long as developers utilising your plugin are listening, they’ll be able to act accordingly.
What client developers should do
If you’ve built something for a client, or a product on top of a plugin, you are ultimately responsible for its functionality.
Stay up to date with plugin developments, listen to announcements and ensure major updates don’t crop up without you knowing first.
Plan for maintenance
Understand it won’t be a build once, ignore forever chunk of code. You will need to plan updates and maintenance into your proposal, otherwise your clients will be stuck with old versions. Charge more, as Brian so bluntly puts it:
You wouldn’t sell a car and then fix it for free for life, so when you sell a plugin don’t do the same. Create a plan to deal with updates and do them as required.
Test your code with major updates before running them. If you need to do this on behalf of your client, ensure they are aware of these costs up front.
Follow best practice
If developers tell you how you should be doing something, follow their guidance. In Jonathan’s case he has been including core classes:
We probably have to modify about 40 of them, simply because you guys decide to move files around in the core tree and no other reason. This is seriously bad practice and really ought to stop now.
We’ve never recommended this practice, nor provided any code, snippet or plugin which does this and whilst I cannot comment on whether or not he was right to do what he did, but it doesn’t feel right. We always recommend using the many filters provided, but if they weren’t suitable this leads me to my next point.
If something is wrong, make your case before it is too late
If you spot a problem in the plugin you are developing for, perhaps one you cannot work around, let the developer know. Otherwise, how can they help you?
In the case of WooCommerce we have both a development blog and github issues setup – tell us, suggest an alternative, get involved. If you do nothing you only have yourself to blame.
I know updates can be frustrating and appreciate your situation, but we’re working towards building a better solution overall. If that means breaking some custom code along the way, I honestly believe it’s well worth it in the end.
Please don’t give up, and by all means get involved – thats the beauty of open source, anyone can contribute their ideas, code and guidance.