I didn’t quite mean to make this a “top 10” list, but it did work out to 10 items, and it’s indeed a list.
UPDATE: I didn’t make a few points clear originally, so let me add some context here.
The impetus for writing this post was of 3 weekend projects that never got off the ground because I got bogged down with the setup. I was familiar with the framework I was using, it gave me all the tools I needed to get the project going, and as I started building my functionality I started realizing I needed X, Y and Z to keep going. So I grabbed packages (some I was familiar with, others less so, but all were modular and would fit right in with the framework I was using) and spent a bunch more time getting them connected and playing nice with each other, realizing I needed to modify my database schema to support certain features from those packages, etc.
By the middle of weekend #2 I still hadn’t really started coding what I wanted to work on. During the following week I had a bit of an epiphany that everything I’d spent a bunch of time doing to get my project started using simple, existing modular components that were easy to plug in and use already existed within WordPress. At the start of weekend #3, I started fresh with a WordPress install and just started coding the thing I wanted. I just never realized how much time I spent wrangling modules and components before.
Google App Engine provided a similar feeling. At the time I started playing with App Engine it didn’t support PHP, so I used Python, and I was able to just start coding. Users, permissions, access, etc, were all taken care of. The only thing I was mildly annoyed with was that I couldn’t find any existing themes, but it wasn’t too time consuming to grab a WordPress theme and make it work with Jinja2. Having to define my routes was a little annoying / time consuming too. I realized that WordPress would have made even those two things inconsequential, but they weren’t burdensome. But I digress.
Any CMS or Framework can do most of this stuff. The point isn’t that only WordPress does it, nor is WordPress necessarily the best at it. The point is just that WordPress already has these building blocks in place so when you just want to get your idea out there, there’s a bunch of stuff you just don’t have to deal with.
- User management and roles. Has a fully functional user system available, and easy to hook into or customize. So much better than rolling your own.
- Database structure and abstraction/access. Fully functional database abstraction layer, and supports custom data types (just imagine custom post types are your default storage engine, not “posts”; and custom taxonomies are your relationships).
- Control/Admin panel. WordPress has an admin panel “for free”. Easy to add pages, customize who can see what, etc. This includes a fully-customizable user experience and WYSIWYG editor already present, which can be easily attached to anything.
- HTTP client. WordPress has a pretty smart HTTP client, and can handle a lot of situations (mostly encountered by shared hosts). It’s no Guzzle but it’s very reliable, and functions as expected under most normal circumstances. It even allows non-blocking requests (these are asynchronous but may still trigger handlers on failure/success, just not in the same process or request).
- Scheduled tasks. WP Cron leaves a lot to be desired, but it’s there, and it (mostly) works, and having even a half-assed solution pre-built beats building your own half-assed solution that you’ll never get around to finishing.
- Cache client. With automated fallback if no persistent cache is available.
- Route management / pretty URLs / SEO URLs are already present, and works by default when implementing custom pages, post types, taxonomies, and kind of archive or detail page..
- Pretty much everything has an observer pattern built-in.
- Search. Like scheduled tasks / cron, WordPress search kind of sucks out of the box, but it’s there, and plugins (+ the observer pattern for searches) are available to allow you to search using any kind of actual search engine you want. But again, it’s at least got a “good enough” search already available until you implement an improvement.
- It’s “legacy” code, and ugly, but that doesn’t mean your code has to be. There’s nothing to stop you from writing modern PHP code for your classes and themes. (Except that WordPress can be a little weird about namespaces, due to the way the observer pattern is implemented.) Incidentally, it’s improving. Thing is, these are things you just have to deal with when your software has millions of users and requires backwards compatibility, and also so that your software can reach hundreds of millions of users in the first place.