如何基于用户角色/ID等隐藏WordPress后台菜单项目
问题原因及解决方案
核心错误点
- 钩子选择错误:使用
admin_head钩子且优先级设置为5,此时WooCommerce、Elementor、Yith等第三方插件的菜单尚未完成注册,提前执行删除操作无法匹配到对应菜单。 remove_submenu_page参数不符合规则:该函数要求第一个参数为父菜单的纯slug,第二个参数为子菜单的纯slug,不需要拼接admin.php?page=前缀。WooCommerce顶级菜单的正确slug为woocommerce,你之前传入的路径格式无法匹配到对应父菜单。- 菜单slug包含多余参数:Elementor模板菜单的slug不需要携带
tabs_group=library参数,代码中也不应该使用HTML转义后的&,多余内容会导致菜单匹配失败。
修复后可直接使用的代码
// 为无manage_options权限的用户隐藏后台菜单 function hide_menu() { if ( !current_user_can('manage_options') ) { /* WP 默认菜单 */ remove_menu_page( 'edit.php' ); // 文章 remove_menu_page( 'edit.php?post_type=page' ); // 页面 remove_menu_page( 'edit-comments.php' ); // 评论 remove_menu_page( 'themes.php' ); // 外观 remove_menu_page( 'users.php' ); // 用户 remove_menu_page( 'tools.php' ); // 工具 /* 插件相关菜单 */ // 隐藏WooCommerce子菜单 remove_submenu_page( 'woocommerce', 'wc-settings' ); // WooCommerce设置 remove_submenu_page( 'woocommerce', 'wc-addons' ); // WooCommerce扩展/市场 // 隐藏Elementor模板菜单 remove_menu_page( 'edit.php?post_type=elementor_library' ); // Elementor模板 // 隐藏Yith菜单 remove_menu_page( 'admin.php?page=yith_wcan_panel' ); // Yith } } // 调整钩子为admin_menu,优先级设为999确保所有菜单注册完成后再执行删除 add_action('admin_menu', 'hide_menu', 999 );
补充调试方案
如果调整后Yith菜单仍无法隐藏,可以临时在函数内加入以下代码,在后台页面顶部打印所有已注册菜单的slug,确认Yith菜单的正确标识后替换即可:
global $menu; echo '<pre>'; print_r($menu); echo '</pre>';
调试完成后删除该段代码即可。
内容的提问来源于stack exchange,提问作者94a94
相关产品推荐
相关产品推荐

