WordPress 后台菜单权限控制钩子|仅保留指定的后台菜单项,其余全部隐藏

VFX大学 wordpress开发 WordPress 后台菜单权限控制钩子|仅保留指定的后台菜单项,其余全部隐藏

正在查看 0 条回复
  • 作者
    帖子
    • #405

      追光
      管理员

      这段代码是一个 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 或自定义功能插件中。

正在查看 0 条回复
  • 在下方一键注册,登录后就可以回复啦。