如何移除特定WordPress用户的WooCommerce及Elementor菜单页面
解决WordPress插件菜单隐藏问题
你推测的原因完全正确:这类第三方插件的菜单并非使用WordPress核心页面slug,而是通过admin.php?page=xxx的形式注册;更关键的是你的钩子执行时机太早——WooCommerce和Elementor通常在默认的admin_menu钩子(优先级10)之后才完成菜单注册,导致你的remove_menu_page调用时,目标菜单还未被添加,自然无法生效。
修复方案
调整钩子优先级,并使用完整的页面标识(即admin.php?page=xxx)来移除菜单:
修改后的代码
public function __construct() { // 将钩子优先级设为999,确保在第三方插件注册菜单之后执行 add_action( 'admin_menu', array($this, 'hide_default_menu_pages'), 999 ); } public function hide_default_menu_pages() { $restricted_users = array( 'USERONE', 'USERTWO', ); $current_user = wp_get_current_user(); // 推荐用user_login(注册时的唯一标识),nickname可被修改,若业务需要可保留原逻辑 $username = $current_user->user_login; // $username = get_the_author_meta( 'nickname', $current_user->ID ); if( in_array( $username, $restricted_users ) ){ // 移除核心系统菜单 remove_menu_page( 'themes.php' ); remove_menu_page( 'plugins.php' ); remove_menu_page( 'edit-comments.php' ); remove_menu_page( 'tools.php' ); remove_menu_page( 'options-general.php' ); remove_menu_page( 'edit.php' ); remove_menu_page( 'upload.php' ); // 移除WooCommerce和Elementor菜单 remove_menu_page( 'admin.php?page=wc-admin' ); remove_menu_page( 'admin.php?page=elementor' ); } }
额外说明
- 优先级设置:将
add_action的第三个参数设为999,确保你的代码在绝大多数第三方插件完成菜单注册后执行,保证remove_menu_page能定位到目标菜单。 - 菜单slug验证:如果修改后仍无效,可通过右键菜单→“检查”查看对应
<a>标签的href属性,确认完整的page=xxx参数,以此作为remove_menu_page的参数。
内容的提问来源于stack exchange,提问作者OHICT
相关产品推荐
相关产品推荐

