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

WordPress使用register_uninstall_hook无法移除后台菜单链接问题

问题分析与解决方案

你的核心问题在于对WordPress菜单机制和卸载钩子的执行时机理解有误:

  • 通过add_menu_page()添加的菜单是动态生成的,仅当插件代码被加载时才会显示。插件卸载(文件被删除)后,这段代码不再执行,菜单会自动消失,不需要手动删除。
  • 你当前的卸载逻辑依赖admin_menu钩子,但卸载钩子执行时,admin_menu的触发时机已经过了,导致remove_admin_page()根本不会被执行;而且remove_admin_page()只是临时移除当前请求的菜单显示,并非永久删除。

代码修正方案

1. 简化主文件的卸载逻辑

删除无效的NerdyPluginUninstall类,卸载钩子仅用于清理插件产生的数据库数据(如选项、自定义字段等),菜单无需额外处理:

require_once plugin_dir_path(__FILE__) . 'classes/NerdyPluginUninstall.php';

class NerdyPluginFormEvents {

    // 插件激活代码...
    public function activate() {
        // 你的激活逻辑
    }

    // 插件停用代码(可选:停用后立即隐藏菜单)
    public function deactivate() {
        // 立即移除菜单
        remove_menu_page('mm_admin_menu');
        // 清除WordPress后台菜单缓存,确保菜单立即消失
        wp_cache_delete('admin_menu', 'cache');
    }

    // 静态卸载方法(WordPress推荐卸载钩子使用静态方法)
    public static function uninstall() {
        // 清理插件生成的数据库数据,示例:
        delete_option('nerdy_plugin_settings');
        delete_option('mm_admin_menu_related_data');
        // 菜单无需手动删除,插件文件删除后自动消失
    }

}

if ( class_exists('NerdyPluginFormEvents')){
    $plugin_form_events = new NerdyPluginFormEvents();
    register_activation_hook( __FILE__, array( $plugin_form_events, 'activate') );
    register_deactivation_hook( __FILE__, array( $plugin_form_events, 'deactivate' ) );
    // 注册静态卸载方法
    register_uninstall_hook( __FILE__, array( 'NerdyPluginFormEvents', 'uninstall' ) );
}

2. 删除无用的NerdyPluginUninstall类

该类的逻辑完全不符合卸载时机的要求,直接删除对应的文件即可。

额外说明

如果卸载插件后菜单仍显示,大概率是WordPress后台菜单缓存导致的,只需:

  • 刷新后台页面
  • 或在停用插件时执行上述deactivate方法里的缓存清理代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:32:42