Sets the deactivation hook for a plugin.
Description
When a plugin is deactivated, the action ‘deactivate_PLUGINNAME’ hook is called. In the name of this hook, PLUGINNAME is replaced with the name of the plugin, including the optional subdirectory. For example, when the plugin is located in wp-content/plugins/sampleplugin/sample.php, then the name of this hook will become ‘deactivate_sampleplugin/sample.php’.
When the plugin consists of only one file and is (as by default) located at wp-content/plugins/sample.php the name of this hook will be ‘deactivate_sample.php’.
Parameters
$file
stringrequired- The filename of the plugin including the path.
$callback
callablerequired- The function hooked to the
'deactivate_PLUGIN'
action.
Source
function register_deactivation_hook( $file, $callback ) {
$file = plugin_basename( $file );
add_action( 'deactivate_' . $file, $callback );
}
Changelog
Version | Description |
---|---|
2.0.0 | Introduced. |
Examples
If you have a function called
myplugin_deactivate()
in the main plugin file at eitherwp-content/plugins/myplugin.php or
wp-content/plugins/myplugin/myplugin.php
use this code:
This will call the
myplugin_deactivate()
function on deactivation of the plugin.If you are using a namespace in the main plugin file
namespace MYNAMESAPCE;
you will need to use the __NAMESPACE__ keyword in your code for register_deactivation_hook.
register_deactivation_hook( __FILE__ , __NAMESPACE__ . '\deactivate_plugin' );
Otherwise, the code will be unable to find the function deactivate_plugin() and will produce a warning:
PHP Warning: call_user_func_array() expects parameter 1 to be a valid callback, function ‘deactivate_plugin’ not found.
It is important to note that despite deactivation and uninstall hooks being available since WP 2.0 and 2.7 respectively, there are still a lot of plugins around that do not properly clean up after themselves, cluttering the database with useless data.
A useful difference between
register_deactivation_hook
and bothregister_uninstall_hook
anduninstall.php
is that our deactivation hook callback is run when the plugin is still active. This means this is the last opportunity to run code that is integrally part of the plugin, without having to purposely load specific parts of the plugin or write very large uninstall routines.So preparing a plugin for a clean uninstall, you might need both these tools: (1) the deactivation action for complicated plugin-specific tasks that need plugin internals, for example removing metadata or transients named variably on user settings and (2) the uninstall action (or better: uninstall.php) to run broader / less complicated tasks like removing a known list of options with
delete_option()
, removing plugin specific database tables or (cache) files.An example code of an deactivation callback using a plugin internal method, prepared for both regular and network deactivation:
Note: one specific problem occurs when your plugin has custom rewrite rules and you need to do revert those on deactivation. A simple
flush_rewrite_rules()
will not work here, due exactly to the fact that the plugin is still active. You’ll need to take care to undo all plugin rewrite rules added withadd_rewrite_rule()
before flushing but sadly, a simple function likeremove_rewrite_rule()
does not exist (yet?)…