You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress插件卸载时如何正确清理及处理许可证停用失败通知?

WordPress插件卸载流程优化:处理许可证停用失败的问题

针对你遇到的卸载阶段无法处理许可证停用错误的问题,核心解决思路是捕获错误并通过可靠渠道记录/通知,同时保证后续清理流程不受影响,具体方案如下:

1. 捕获WP错误并记录到日志

卸载阶段无法使用插件的前端通知方法,但可以将错误信息写入WordPress系统日志,方便后续排查。通过try-catch包裹许可证停用方法,捕获抛出的WP_Error并记录:

2. 确保清理流程的鲁棒性

即使许可证停用失败,也要继续执行后续的自定义选项删除、角色清理等操作,避免残留数据。

修改后的完整代码

static function uninstall_plugin(): void
{
    if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
        exit;
    }

    // 清理用户元数据与角色(修正拼写错误:çlient → client)
    $users = get_users();
    foreach ($users as $user){
        delete_user_meta($user->ID,'booking');
        $user->remove_role('client');
    }

    // 加载许可证类并尝试停用
    require_once plugin_dir_path( __FILE__ ) . 'includes/Licence.php';
    try {
        Licence::__deactivate();
    } catch (WP_Error $e) {
        // 将错误写入WordPress日志
        error_log( sprintf('插件卸载时许可证停用失败:%s', $e->get_error_message()) );
        // 可选:若需用户知晓,可临时存错误到选项(但插件卸载后文件会被删除,日志更可靠)
        // update_option('my_plugin_uninstall_error', $e->get_error_message());
    }

    // 执行数据库卸载
    require_once plugin_dir_path( __FILE__ ) . 'admin/Database.php';
    Database::uninstall();

    // 移除自定义角色
    remove_role('client');
    remove_role('my-plugin-manager');

    // 删除自定义选项(包括许可证密钥相关设置)
    delete_option("my-plugin-option");
    // 若许可证密钥存于单独选项,需额外删除
    // delete_option("my-plugin-license-key");
}

补充说明

  • 日志查看:可通过WordPress后台「工具→站点健康→信息→服务器」找到日志文件路径,或直接查看服务器PHP错误日志。
  • 临时通知备选:若一定要让用户知晓错误,可在捕获错误后将信息存入临时选项,再在插件主文件中添加admin_notices钩子检测显示,但插件卸载后文件会被删除,仅用户再次安装时能看到,因此日志仍是更优选择。
  • 路径修正:若uninstall.php位于插件根目录,plugin_dir_path(__FILE__)比plugin_dir_path(dirname(__FILE__))更准确,避免路径层级错误。

内容的提问来源于stack exchange,提问作者Narrim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:18:38