如何实现WordPress仪表盘菜单项仅对管理员用户可见
问题说明
你需要实现自定义插件对应的仪表盘菜单项仅对管理员可见,先后两次编写的代码均未达到预期,核心问题是对WordPress核心函数的作用理解有误。
原有代码问题分析
- 你两次代码都误用了
is_admin()函数:这个函数的作用是判断当前访问的页面是否属于后台管理界面,和当前登录用户是不是管理员没有任何关系——任何登录用户访问wp-admin路径下的页面,is_admin()都会返回true,完全不能用于用户身份判断。 - 第一版代码逻辑为「当前在后台页面时不做任何操作,非后台页面才移除菜单」,后台场景下根本不会执行移除逻辑,自然不符合预期。
- 第二版代码逻辑为「当前不在后台时不操作,在后台就移除菜单」,会导致所有后台用户(包括管理员)都看不到菜单,你测试时author身份仍能看到,是因为贴出的第二版代码缺少函数声明头部、函数体大括号闭合错误,代码根本没有正常执行。
正确实现方案
优先推荐从注册源头控制菜单显示,比菜单注册后再移除的逻辑更稳定,兼容性更好。
方案1:注册自定义文章类型时直接控制权限(推荐)
你提到的菜单路径是edit.php?post_type=registered_email,说明该菜单对应一个自定义文章类型,只需要在注册该文章类型时直接配置权限和显示规则即可:
// 注册registered_email自定义文章类型的参数配置 $cpt_args = array( // 此处保留你之前配置的标签、slug、前台显示等原有参数 'show_in_menu' => current_user_can( 'manage_options' ), // 仅具备manage_options权限的用户(默认即管理员)显示菜单 'capability_type' => 'manage_options', // 该文章类型的所有操作权限绑定到管理员权限,非管理员直接无法访问相关页面 ); register_post_type( 'registered_email', $cpt_args );
用
current_user_can( 'manage_options' )做判断是WordPress官方推荐的管理员判断方式,比直接判断用户角色是否为administrator兼容性更强,适配存在自定义角色的站点场景。
方案2:菜单注册后移除非管理员可见的菜单
如果你不方便修改自定义文章类型的注册代码,可以用admin_menu钩子在菜单注册完成后,对非管理员隐藏菜单,代码如下:
function custom_plugin_menu_only_for_admins() { // 非管理员用户时,移除对应菜单项 if ( ! current_user_can( 'manage_options' ) ) { remove_menu_page( 'edit.php?post_type=registered_email' ); } } // 优先级设为999,确保在系统完成所有菜单注册后再执行移除操作 add_action( 'admin_menu', 'custom_plugin_menu_only_for_admins', 999 );
注意要保证代码的函数结构完整,不要出现缺失函数声明、大括号不闭合的语法错误,否则代码会无法正常执行。
内容的提问来源于stack exchange,提问作者maarten geuns
相关产品推荐
相关产品推荐

