Using WordPress ‘register_uninstall_hook()’ PHP function

The register_uninstall_hook() WordPress PHP function sets the uninstallation hook for a plugin.

Usage

register_uninstall_hook( __FILE__, 'my_plugin_uninstall' );

Parameters

  • $file (string) – Required. The plugin file.
  • $callback (callable) – Required. The callback to run when the hook is called. Must be a static method or function.

More information

See WordPress Developer Resources: register_uninstall_hook()

Examples

Basic Uninstall Hook

Register an uninstall hook when the plugin is activated:

function my_plugin_activate() {
    register_uninstall_hook( __FILE__, 'my_plugin_uninstall' );
}
register_activation_hook( __FILE__, 'my_plugin_activate' );

function my_plugin_uninstall() {
    // Code to perform during uninstallation
}

Delete Options on Uninstall

Delete plugin options when the plugin is uninstalled:

function my_plugin_uninstall() {
    delete_option('my_plugin_option');
}
register_uninstall_hook( __FILE__, 'my_plugin_uninstall' );

Remove Custom Post Type on Uninstall

Remove all posts of a custom post type when the plugin is uninstalled:

function my_plugin_uninstall() {
    $posts = get_posts( array(
        'post_type'   => 'my_custom_post_type',
        'numberposts' => -1,
        'post_status' => 'any'
    ));

    foreach ( $posts as $post ) {
        wp_delete_post( $post->ID, true );
    }
}
register_uninstall_hook( __FILE__, 'my_plugin_uninstall' );

Remove Custom Taxonomy Terms on Uninstall

Remove all terms of a custom taxonomy when the plugin is uninstalled:

function my_plugin_uninstall() {
    $terms = get_terms( array(
        'taxonomy'   => 'my_custom_taxonomy',
        'hide_empty' => false,
    ));

    foreach ( $terms as $term ) {
        wp_delete_term( $term->term_id, 'my_custom_taxonomy' );
    }
}
register_uninstall_hook( __FILE__, 'my_plugin_uninstall' );

Remove Custom Database Table on Uninstall

Drop a custom database table when the plugin is uninstalled:

function my_plugin_uninstall() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'my_custom_table';
    $wpdb->query( "DROP TABLE IF EXISTS {$table_name}" );
}
register_uninstall_hook( __FILE__, 'my_plugin_uninstall' );