这段代码是一个 WordPress 后台菜单权限控制钩子,其作用是:
🚫 在特定子站点中,仅保留指定的后台菜单项,其余全部隐藏。
用于多站点(Multisite)系统中对子站点后台的精细化控制,例如用于知识库、前台编辑等特殊站点,防止非管理员用户访问无关页面,保持界面简洁可控。
✅ 代码完整讲解与用途说明
add_action('admin_menu', function () {
// ✅ 仅在子站 ID 为 4 时生效,防止主站或其他子站被影响
if (get_current_blog_id() != 4) return;
// ✅ 如果希望管理员不受限制,可取消注释下面这行
// if (current_user_can('manage_options')) return;
global $menu;
// ✅ 允许保留的菜单 slug 列表,其他全部隐藏
$allowed_menus = [
'edit.php?post_type=isa_docs', // 📘 自定义文档系统(isa_docs)
'plugins.php', // 🔌 插件管理
'options-general.php', // ⚙️ 设置菜单
'tools.php', // 🛠 工具菜单
'users.php', // 👤 用户管理
// 'edit.php?post_type=page', // ❌(可选)页面编辑功能,如不需要可注释
'seo', // 🔍 SEO插件,例如 Yoast、Rank Math
// 下面几项也可以开启:
// 'customize.php', // 🎨 自定义外观(仅支持前台可视化主题)
// 'widgets.php', // 🔧 小工具
// 'nav-menus.php', // 🍱 菜单编辑器
];
// 遍历所有菜单项,如果不在允许列表中,则移除
foreach ($menu as $key => $item) {
$slug = $item[2]; // 菜单的 slug 值
if (!in_array($slug, $allowed_menus)) {
remove_menu_page($slug); // ❌ 移除不在白名单的菜单项
}
}
}, 999); // 使用高优先级确保在菜单加载完成后再执行
📌 应用场景扩展
这个方案非常适合于以下类型的 WordPress 项目或子站配置:
项目类型
|
功能定位
|
用途说明
|
🧾 知识库/文档站(如 isa_docs)
|
只需访问文档和工具
|
用户专注撰写文档,禁用外观、页面等干扰菜单
|
🛍 订单管理子站
|
仅开放用户与插件管理
|
管理员分权限维护不同功能子系统
|
📚 教程/在线课程平台
|
禁止修改主题、页面
|
保证前端UI一致性,避免非技术人员误操作
|
🧪 测试子站
|
控制测试环境权限
|
避免开发者在测试子站误操作主站内容
|
🧠 进阶建议
1. 按用户角色进一步控制
例如你可以为 editor 角色显示一组菜单,为 subscriber 显示更少项:
if (!current_user_can('editor')) {
$allowed_menus = [...]; // 更少的权限菜单
}
2. 结合
remove_submenu_page()
控制子菜单
如果还需要细化子菜单(如设置里的某些子项),可以这样加:
remove_submenu_page('options-general.php', 'reading.php'); // 禁用“阅读设置”
3. 搭配
admin_head
进一步隐藏界面元素
可以配合 admin_head 用 JS/CSS 彻底隐藏按钮、面板等 UI 控件,达到更极致的“只留需要功能”的体验。
✅ 总结
这段代码是一种精准控制后台权限的高级技巧,适合:
-
多站点部署
-
高度定制后台管理界面
-
控制子站功能范围,提升安全性与用户专注度
也可以将其封装为可配置模块,方便其他子站继承并应用。适用于 functions.php 或自定义功能插件中。