I don’t mean you need to design all your code to have special Multisite features. I mean that if you’re not writing code to work on multisite, you’re probably doing a lot of things non-optimally and not fully WordPressy. When you write your code with Multisite in mind, you’re actually writing it with the basic tenants of WordPress itself. It forces you to think about how WordPress is used, how it might be used, and how you can be flexible and extendable.
Let’s throw out the idea of network options and activation for a moment and consider the ways we can write our code to make it work for Multisite and the world. The truth is that if you’re coding ‘for Multisite’ in many ways your coding for WordPress in the best way possible.
Calling Files Calling Files
There’s a time and a place for
ABSPATH but it’s as a last resort. There’s a time and a place for
get_bloginfo('url') but it’s not to call
.'/wp-admin/admin.php either. Did you know
admin_url() will get the url to the admin area using the right protocol (http or https) for you? And it works for Multisite. Instead of hardcoding your paths or assuming everyone has WordPress installed in the root of their website (they don’t), use the functions and template calls WordPress has created.
Oh and stop supporting the old WordPress 2.x ways of determining folders. It’s 2015. We’re good.
Saving Files Saving Files
Saving data to the disk means everyone can read it. Duh, right? Well, where do you save uploaded files? You use
wp_upload_dir of course. That works on Multisite just fine. Instead, if you hardcode in
/wp-content/uploads/myplugin/ then you’re saving things for everyone. If you’re not using the WordPress options to grab the upload directory, then your code won’t work on Multisite and everyone will be sad.
This extends to where you save your cache files. Did you know there’s a plugin that saves the cache to the plugin folder itself? Besides the fact that the cache didn’t have a way to flush and grew to 700megs over the year the person used it, that cache was for all the sites in the network. All. Saving the cache to a unique location (I suggest
/wp-content/pluginname-cache/siteID) prevents cross contamination of cache.
Saving Options Saving Options
If you write a plugin that, to save its data, it creates a new DB table and saves it there, that can be okay. But if your plugin on update then drops that table and recreates it… That was not pulled at random, by the way, I was reviewing a plugin that did that. Instead he should have been using the function
update_option() to create (and update) the options. And yes, it knows.
But that’s an extreme, I admit. What isn’t an extreme is people creating their own tables. It happens a lot. And when they do, they often forget that we have
$wpdb->prefix which means they force create
wp_mypluginname instead of
$wpdb->prefix . "mypluginname" … guess which one’s smart enough to know it’s on Multisite?
(If you want to make a network table use
$wpdb->base_prefix and use
update site option for network wide options, yes, we know the naming conventions are weird.)
Theme Customizer Theme Customizer
Not everyone can edit theme files. Not everyone can make child themes. On a Multisite, the only person who can do that is the Super Admin. Site Admins have no access to edit files or upload themes. Worse, if you make a change to a theme, everyone who uses that theme gets the change. What happens when a site wants a special header and your theme doesn’t allow those to be edited via the customizer? The customizer is there for a reason. Use it. At the very least make things hookable to allow plugins to do simple things like change footers. Please. Please. That’s one of the things that themes get wrong constantly.
What Else? What Else?
What do you think would be improved if people ‘coded for Multisite’?