Plugin authors dedicate a lot time and vitality into the primary performance of their merchandise, that they permit much less essential stuff to fall by the wayside.
Take activation and deactivation, for instance. Whereas activation hooks are widespread – many plugins want so as to add some choices, flush rewrite guidelines, possibly create a database desk, or verify for model variations on set up – deactivation and uninstallation hooks are far much less frequent.
The purpose right here? Many plugin authors don’t take the time to scrub up after themselves. Does the WordPress set up actually need the customized desk you created after eradicating the plugin? Why not filter a number of choices which can be unique to the plugin earlier than trashing it?
On this article, I’ll present you easy methods to use activation, deactivation and uninstallation hooks to initialize your plugin and clear issues up extra simply after customers are performed together with your product.
The Set up Sequence
Flushing Rewrite Guidelines
Creating Database Tables
Dependency Checks
The Deactivation Hook
The Uninstallation Hook
Further Safety
It’s Time To Clear Up
Notice: If you happen to plan to skim by means of this text, I strongly counsel taking a peek on the “Further Safety” part on the finish, which enhances the code with some invaluable safety checks. Additionally, in the event you need assistance with WordPress plugin hooks, here’s a fast refresher on utilizing WordPress hooks and easy methods to activate a perform in WordPress.
The Activation Hook
Though the activation hook is sort of simple, putting in it’s a little bit of a particular case, so we’ll want to concentrate to the sequence of occasions. Earlier than we go into all this, right here’s a easy instance:
The important thing to all of it is the register_activation_hook() perform. The primary parameter is the trail to the primary plugin file; the second parameter defines the perform to run. Internally, the register_activation_hook() perform is a wrapper for the “activate_[plugin_name]” motion, however because it’s a bit simpler to make use of, it’s uncommon to see the hook in plugins.
The Set up Sequence
Understanding the set up sequence is essential as a result of it prevents utilizing strategies chances are you’ll be used to. register_activation_hook() is known as in-between the consumer clicking on the activation hyperlink and consequently seeing the activation discover. It runs on an middleman web page, which redirects instantly earlier than any hooks can have an opportunity to run.
Let’s take a look at an instance to see why this can be a big bummer:
Flushing Rewrite Guidelines
A variety of plugins create customized submit varieties. Flushing the rewrite guidelines on activation to be sure that customers don’t get a 404 error when visiting a submit from the brand new customized submit kind is a brilliant transfer.
The code under appears logical however will fail.
It appears completely high-quality. The customized submit kind is created and on activation, we flush the rewrite guidelines. The issue is that the customized submit varieties haven’t but been created once we flush the rewrite guidelines.
Right here’s how the method stream appears:
The consumer installs the plugin.
The consumer clicks the activation hyperlink.
An middleman web page runs the activation hook solely, nothing else. This flushes the rewrite guidelines.
The plugin is energetic and code runs as traditional. The customized submit kind is registered.
An answer posted on Stack Overflow, which is formally endorsed by the WordPress Codex, solves our little downside. The answer includes including an choice to point that the plugin has simply been put in.
If this feature exists, we do our activation stuff after which delete it.
One thing like this:
Personally, I don’t like this answer an excessive amount of. The issue is that the verify on line eight runs on each single web page load. It’s nothing to be involved about, because it gained’t put an enormous load in your servers and it gained’t decelerate the web site in your customers. It’s a really fast verify with a negligible influence on efficiency. It’s, nonetheless, pointless 99.9% of the time.
There’s a higher answer talked about in the Codex within the documentation for the flush_rewrite_rules() perform. On this answer, we use the modularity of our features to register the customized submit kind on activation individually:
As an alternative of counting on a verify that should run on a regular basis, we use the activation perform to register our submit varieties. Notice that when our plugin is activated, the submit varieties will at all times be registered from the init hook.
It is a unhappy instance of the Codex being all over. Usually, WordPress does have good documentation, but when one thing appears wasteful or illogical, don’t be afraid to perform a little research of your personal.
Creating Database Tables
One other job that some plugins carry out is to create database tables. As a rule, that is pointless, however there are some legit use instances.
This instance from the Codex article on Creating Tables exhibits how a number of activation calls can be utilized:
The primary perform, jal_install() creates a brand new database desk. The second perform, jal_install_data provides preliminary information to the desk. As an alternative of utilizing register_activation_hook() so as to add one perform containing all of this code, we are able to use register_activation_hook a number of occasions.
It is a nice apply for modularity. On one hand, you don’t have so as to add preliminary check information – it’s so simple as eradicating the activation hook – so you may hold the perform intact. However, you’re free to reuse these features wherever since they’re separate.
Dependency Checks
One other frequent job for the activation perform is to verify for dependencies. Your plugin might depend on a selected model of WordPress, one other plugin, or perhaps a particular model of PHP.
The code under checks for a minimal WP and PHP model and redirects the consumer (with out activating the plugin) if needed:
The Deactivation Hook
Deactivation hooks run when a consumer has deactivated a plugin, however earlier than it’s uninstalled (deleted). Deactivation hooks are utilized in the identical manner as activation hooks:
Deactivation implies that the consumer has solely deactivated your plugin, so that you gained’t need to do as a lot as you’d throughout an uninstall. You could need to flush rewrite guidelines maybe, however at this stage, you gained’t need to eliminate all of your choices and your database desk (when you have one).
That is pretty simple however I’ll pay particular consideration to flushing rewrite guidelines as, as soon as once more, these are problematic.
The codex recommends doing them as proven under, however this doesn’t work:
The explanation this doesn’t work is similar as earlier than. Working a deactivation performs the init hook, which implies that as we’re deactivating our plugin, we’re additionally registering our customized submit kind. The rewrite guidelines are flushed, however they keep in mind the customized submit kind.
A Trac ticket is in place to sort out this, however till then, I can’t provide you with an excellent manner of doing this. The one manner I’ve discovered that works is to delete the rewrite guidelines altogether:
Whereas this has labored for me previously, I’d not suggest it. It introduces a higher uncertainty than the issue of getting a number of additional rewrite guidelines. I’d fairly show a be aware to customers asking them to go to the permalink settings after deactivation, which might flush the rewrite guidelines. Till a greater answer is applied, we’re caught with this… sorry!
The Uninstallation Hook
There are two methods to run code when uninstalling a plugin. You should use the uninstallation hook by way of register_uninstall_hook() or you should utilize a devoted uninstall.php file inside your plugin. I’ll present you each, however the most popular technique is to make use of the uninstall file.
The primary concern with the uninstallation hook is that “it prevents the primary plugin file from being run throughout uninstall, which may be problematic if the plugin runs code within the international area. It’s additionally higher in that the uninstall code is centralized.” – Scott Riley
The code under exhibits the uninstallation course of utilizing a fundamental hook:
As mentioned, this isn’t one of the best answer. A much better method to deal with uninstallations is to make use of the uninstall.php file. All you have to do is create it and it is going to be used whether it is obtainable.
As you may see, that is really an easier answer. Better of all, it’s self-contained.
Further Safety
I didn’t need to over-complicate the examples proven to date with security-related points, however you actually ought to take some steps to make sure that solely those that are allowed to take action can run these actions.
Use the next snippet on activation and deactivation:
This code block makes positive that the consumer has the permissions to carry out this motion and that the motion originated on the correct web page. This could defend in opposition to most malicious makes an attempt.
The uninstallation course of is particular, so we’ll want to make use of barely completely different code:
It’s Time To Clear Up
In case your plugin provides stuff to WordPress, then it’s your obligation as a developer to take away it when a consumer decides to delete your plugin.
Utilizing the activation, deactivation and uninstallation strategies outlined above will mean you can construct a system that does this safely and securely. I additionally extremely suggest studying this Stackexchange thread, which outlines these processes in OOP environments.
If you happen to’re not a WPMU DEV member but, join at the moment for a free trial, utterly risk-free. As a member, you’ll get entry to all of our nice plugins and blazing quick internet hosting service, plus skilled 24/7 help for all of your WordPress-related questions and points.
Subscribe to MarketingSolution.
Receive web development discounts & web design tutorials.
Now! Lets GROW Together!