您的插件在从站点卸载时可能需要执行一些清理工作。

如果用户已停用插件,然后在 WordPress 管理后台点击删除链接,则视为该插件已卸载。

当您的插件被卸载时,您希望清除与该插件特定的任何插件选项和/或设置,以及/或其他数据库实体(如表)。

经验不足的开发者有时会错误地使用停用钩子来实现此目的。

下表说明了停用与卸载之间的区别。

ScenarioDeactivation HookUninstall Hook
Flush Cache/TempYesNo
Flush PermalinksYesNo
Remove Options from {$wpdb->prefix}_optionsNoYes
Remove Tables from wpdbNoYes

方法 1:register_uninstall_hook

要设置卸载钩子,请使用 register_uninstall_hook() 函数:

register_uninstall_hook(
	__FILE__,
	'pluginprefix_function_to_run'
);

方法 2:uninstall.php

要使用此方法,您需要在插件的根文件夹内创建一个 uninstall.php 文件。当用户删除插件时,此魔法文件会自动运行。

例如:/plugin-name/uninstall.php


在执行任何操作之前,始终在 uninstall.php 中检查常量 WP_UNINSTALL_PLUGIN。这可以防止直接访问。

WordPress 会在调用 uninstall.php 时定义该常量。

当通过 register_uninstall_hook() 执行卸载时,不会定义该常量。

以下是删除选项条目并删除数据库表的示例:

// if uninstall.php is not called by WordPress, die
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
    die;
}

$option_name = 'wporg_option';

delete_option( $option_name );

// for site options in Multisite
delete_site_option( $option_name );

// drop a custom database table
global $wpdb;
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}mytable" );

在 Multisite 中,遍历所有博客以删除选项可能会非常消耗资源。