When you write a WordPress plugin, you can specify a minimum WordPress version that your code is compatible with, using the “Requires” option in your plugin header, but it isn’t enforced. Along with that, there’s no way to specify a minimum version of PHP or MySQL.
This can cause your users to have bad experiences with your plugin, and you’ll get bad ratings.
So, here’s how I make sure my plugins are only activated when I want them to be.
// In this example, only allow activation on WordPress 3.7 or higher
class MyPlugin {
function __construct() {
add_action( 'admin_init', array( $this, 'check_version' ) );
// Don't run anything else in the plugin, if we're on an incompatible WordPress version
if ( ! self::compatible_version() ) {
return;
}
}
// The primary sanity check, automatically disable the plugin on activation if it doesn't
// meet minimum requirements.
static function activation_check() {
if ( ! self::compatible_version() ) {
deactivate_plugins( plugin_basename( __FILE__ ) );
wp_die( __( 'My Plugin requires WordPress 3.7 or higher!', 'my-plugin' ) );
}
}
// The backup sanity check, in case the plugin is activated in a weird way,
// or the versions change after activation.
function check_version() {
if ( ! self::compatible_version() ) {
if ( is_plugin_active( plugin_basename( __FILE__ ) ) ) {
deactivate_plugins( plugin_basename( __FILE__ ) );
add_action( 'admin_notices', array( $this, 'disabled_notice' ) );
if ( isset( $_GET['activate'] ) ) {
unset( $_GET['activate'] );
}
}
}
}
function disabled_notice() {
echo '<strong>' . esc_html__( 'My Plugin requires WordPress 3.7 or higher!', 'my-plugin' ) . '</strong>';
}
static function compatible_version() {
if ( version_compare( $GLOBALS['wp_version'], '3.7', '<' ) ) {
return false;
}
// Add sanity checks for other version requirements here
return true;
}
}
global $myplugin;
$myplugin = new MyPlugin();
register_activation_hook( __FILE__, array( 'MyPlugin', 'activation_check' ) );
It’s only a little extra code when added to a plugin, provides complete protection, and won’t cause any weirdness on the front end of your site, it’ll just deactivate itself either on activation, or when someone visits wp-admin.
Comments
4 responses to “Don’t Let Your Plugin Be Activated on Incompatible Sites”
[…] Developer Gary Pendergast has a better way of accomplishing the same goal. Using the code in his post, plugins are only activated if a specific version of WordPress or higher is installed. With this […]
Hi,
You have this Wp pluggin name ‘Job Manager’ does it have this code?
It’s labeled as ‘Requires: 2.9 or higher’.
A friend of mine installed it and he told me it was working perfect; recently after he gave the site to his client, the site stoped to show the information for every job entry.
I told him he was using a newer version of WP but I wanted to ask you just to make sure that’s what’s causing he’s troubles since he told me in the beginning everything was fine.
Regards from C.R
B.
I have activated the plugin and I have latest version of wordpress but it doesn’t seem to work. When I press apply, it doesn’t show anything..please help
[…] topic at the pressingmatters.io blog. There’s also a post by Gary Pendergast called “Don’t Let Your Plugin Be Activated on Incompatible Sites“, which introduces a similar approach as the one presented in this […]