Uninstall and cleanup hooks help remove plugin data when you delete the plugin. This keeps your website clean and fast.
Uninstall and cleanup hooks in Wordpress
<?php register_uninstall_hook(__FILE__, 'my_plugin_uninstall'); function my_plugin_uninstall() { // Cleanup code here delete_option('my_plugin_option'); // Remove custom tables or meta } ?>
The register_uninstall_hook function links your cleanup function to plugin uninstall.
The cleanup function should delete all plugin data like options, tables, or metadata.
<?php register_uninstall_hook(__FILE__, 'cleanup_plugin_data'); function cleanup_plugin_data() { delete_option('plugin_setting'); delete_site_option('plugin_network_setting'); }
<?php register_uninstall_hook(__FILE__, 'remove_custom_table'); function remove_custom_table() { global $wpdb; $table = $wpdb->prefix . 'custom_table'; $wpdb->query("DROP TABLE IF EXISTS $table"); }
<?php register_uninstall_hook(__FILE__, 'delete_user_meta_data'); function delete_user_meta_data() { global $wpdb; $wpdb->query("DELETE FROM $wpdb->usermeta WHERE meta_key = 'plugin_user_meta'"); }
This plugin creates an option and a custom table on activation. When uninstalled, it deletes the option, drops the table, and removes user meta data related to the plugin.
<?php /** * Plugin Name: Cleanup Example */ register_uninstall_hook(__FILE__, 'cleanup_example_uninstall'); function cleanup_example_uninstall() { // Remove plugin option delete_option('cleanup_example_option'); // Remove custom table global $wpdb; $table_name = $wpdb->prefix . 'cleanup_example_table'; $wpdb->query("DROP TABLE IF EXISTS $table_name"); // Remove user meta $wpdb->query("DELETE FROM $wpdb->usermeta WHERE meta_key = 'cleanup_example_user_meta'"); } // Plugin activation creates option and table for demonstration register_activation_hook(__FILE__, 'cleanup_example_activate'); function cleanup_example_activate() { add_option('cleanup_example_option', 'some value'); global $wpdb; $table_name = $wpdb->prefix . 'cleanup_example_table'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, data text NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); }
Uninstall hooks only run when the plugin is deleted from the WordPress admin, not when deactivated.
Always test uninstall code on a backup site to avoid accidental data loss.
Use register_uninstall_hook or an uninstall.php file for cleanup.
Uninstall hooks help remove all plugin data when deleting the plugin.
Use register_uninstall_hook to link a cleanup function.
Cleanup includes deleting options, custom tables, and user meta.
Practice
register_uninstall_hook in a WordPress plugin?Solution
Step 1: Understand the role of uninstall hooks
Uninstall hooks are designed to remove all plugin data when the plugin is deleted to keep the site clean.Step 2: Identify the function of
This function links a cleanup function that runs on plugin deletion to remove options, transients, and custom tables.register_uninstall_hookFinal Answer:
To clean up plugin data when the plugin is deleted -> Option CQuick Check:
Uninstall hook purpose = clean up data [OK]
- Confusing uninstall hooks with activation hooks
- Thinking uninstall hooks add features instead of cleaning
- Using uninstall hook to enqueue scripts
Solution
Step 1: Recall the correct function for uninstall hooks
The correct function to register an uninstall hook isregister_uninstall_hookwith the plugin file and cleanup function.Step 2: Check the syntax of each option
register_uninstall_hook(__FILE__, 'my_cleanup_function'); uses the correct function and parameters. Options A, B, and D use incorrect functions or hooks.Final Answer:
register_uninstall_hook(__FILE__, 'my_cleanup_function'); -> Option DQuick Check:
Correct uninstall hook syntax = register_uninstall_hook(__FILE__, 'my_cleanup_function'); [OK]
- Using activation hook instead of uninstall hook
- Using add_action with wrong hook name
- Confusing filters with hooks
function cleanup_plugin() {
delete_option('plugin_setting');
delete_transient('plugin_cache');
global $wpdb;
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}plugin_data");
}
What will happen when the plugin is uninstalled?Solution
Step 1: Analyze the cleanup function actions
The function deletes an option, a transient, and drops a custom database table using SQL.Step 2: Understand uninstall hook behavior
When the uninstall hook calls this function, all these cleanup actions will run, removing all plugin data.Final Answer:
All plugin data including options, transients, and custom tables will be removed -> Option AQuick Check:
Cleanup function deletes all data = All plugin data including options, transients, and custom tables will be removed [OK]
- Assuming uninstall hooks do not run cleanup functions
- Thinking only options or transients are deleted
- Ignoring the SQL DROP TABLE command
register_uninstall_hook('my-plugin/my-plugin.php', 'cleanup_plugin');
function cleanup_plugin() {
delete_option('my_plugin_option');
}Solution
Step 1: Check the first parameter of register_uninstall_hook
The first parameter should be the plugin main file path, usually passed as __FILE__ for reliability.Step 2: Understand why using a string path is problematic
Using a string path can cause the hook not to trigger if the path is incorrect or changes; __FILE__ ensures correct reference.Final Answer:
The plugin file path should use __FILE__ instead of a string -> Option AQuick Check:
Use __FILE__ for plugin path in uninstall hook [OK]
- Using string path instead of __FILE__
- Thinking function name must have uninstall prefix
- Registering hook inside cleanup function
wp_custom_data. Which of the following uninstall functions correctly performs this cleanup?Solution
Step 1: Review each cleanup action
function uninstall_plugin() { delete_option('plugin_option'); delete_transient('plugin_transient'); global $wpdb; $wpdb->query("DROP TABLE IF EXISTS wp_custom_data"); } deletes the option, transient, and drops the custom table safely using IF EXISTS.Step 2: Compare with other options
function uninstall_plugin() { delete_option('plugin_option'); delete_transient('plugin_transient'); global $wpdb; $wpdb->query("DROP TABLE wp_custom_data"); } drops table without IF EXISTS (may cause error if table missing). function uninstall_plugin() { delete_option('plugin_option'); delete_transient('plugin_transient'); global $wpdb; $wpdb->query("DELETE FROM wp_custom_data"); } deletes rows but not table. function uninstall_plugin() { delete_option('plugin_option'); delete_transient('plugin_transient'); } misses table cleanup.Final Answer:
function uninstall_plugin() { delete_option('plugin_option'); delete_transient('plugin_transient'); global $wpdb; $wpdb->query("DROP TABLE IF EXISTS wp_custom_data"); } -> Option BQuick Check:
Safe drop table + delete option and transient = function uninstall_plugin() { delete_option('plugin_option'); delete_transient('plugin_transient'); global $wpdb; $wpdb->query("DROP TABLE IF EXISTS wp_custom_data"); } [OK]
- Dropping table without IF EXISTS causing errors
- Deleting rows instead of dropping table
- Forgetting to remove custom tables
Ready to prove it?
Pass the test and this pattern moves unknown
