You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于用户角色隐藏WordPress后台菜单的技术实现需求

WordPress 按角色自定义后台菜单可见性方案

一、纯代码实现(无需插件)

1. 默认限制非管理员菜单可见性

在主题的functions.php文件或自定义插件中添加以下代码,默认隐藏非管理员的冗余菜单,仅保留必要项(可根据需求调整移除的菜单):

function custom_restrict_non_admin_menus() {
    // 仅对非管理员生效
    if (!current_user_can('administrator')) {
        // 示例:移除外观、插件、工具、设置等菜单
        remove_menu_page('themes.php');
        remove_menu_page('plugins.php');
        remove_menu_page('tools.php');
        remove_menu_page('options-general.php');
        // 如需移除更多菜单,添加对应slug的remove_menu_page调用即可
    }
}
add_action('admin_menu', 'custom_restrict_non_admin_menus');

2. 管理员可视化配置角色菜单权限

如果需要管理员灵活配置各角色的隐藏菜单,可添加后台配置页面,实现可视化管理:

// 添加菜单权限配置页面
function custom_menu_permissions_admin_page() {
    add_options_page(
        '菜单权限配置',
        '菜单权限',
        'manage_options',
        'menu-permissions-settings',
        'custom_menu_permissions_render_page'
    );
}
add_action('admin_menu', 'custom_menu_permissions_admin_page');

// 渲染配置页面
function custom_menu_permissions_render_page() {
    if (!current_user_can('manage_options')) wp_die('无权限访问');

    // 保存配置逻辑
    if (isset($_POST['save_menu_permissions'])) {
        check_admin_referer('menu_permissions_nonce');
        $permissions = [];
        foreach ($_POST['hidden_menus'] as $role => $menus) {
            $permissions[$role] = array_filter($menus);
        }
        update_option('custom_role_menu_permissions', $permissions);
        echo '<div class="updated"><p>配置已保存</p></div>';
    }

    $saved_perms = get_option('custom_role_menu_permissions', []);
    $roles = wp_roles()->roles;
    // 定义所有可配置的后台菜单
    $available_menus = [
        'index.php' => '仪表盘',
        'edit.php' => '文章',
        'upload.php' => '媒体',
        'edit.php?post_type=page' => '页面',
        'themes.php' => '外观',
        'plugins.php' => '插件',
        'users.php' => '用户',
        'tools.php' => '工具',
        'options-general.php' => '设置'
    ];
?>
<div class="wrap">
    <h1>菜单权限配置</h1>
    <form method="post">
        <?php wp_nonce_field('menu_permissions_nonce'); ?>
        <?php foreach ($roles as $slug => $role) : ?>
            <?php if ($slug !== 'administrator') : ?>
                <h3><?php echo $role['name']; ?></h3>
                <table class="form-table">
                    <tr>
                        <td>
                            <?php foreach ($available_menus as $menu_slug => $menu_name) : ?>
                                <label>
                                    <input type="checkbox" 
                                           name="hidden_menus[<?php echo $slug; ?>][<?php echo $menu_slug; ?>]"
                                           <?php checked(in_array($menu_slug, $saved_perms[$slug] ?? [])); ?>
                                    > 隐藏「<?php echo $menu_name; ?>」
                                </label><br>
                            <?php endforeach; ?>
                        </td>
                    </tr>
                </table>
            <?php endif; ?>
        <?php endforeach; ?>
        <p class="submit">
            <input type="submit" name="save_menu_permissions" class="button-primary" value="保存配置">
        </p>
    </form>
</div>
<?php
}

// 应用菜单权限配置
function custom_apply_menu_permissions() {
    if (current_user_can('administrator')) return;

    $user = wp_get_current_user();
    $saved_perms = get_option('custom_role_menu_permissions', []);
    
    foreach ($user->roles as $role) {
        $hidden_menus = $saved_perms[$role] ?? [];
        foreach ($hidden_menus as $slug) {
            remove_menu_page($slug);
        }
    }
}
add_action('admin_menu', 'custom_apply_menu_permissions', 999); // 高优先级确保覆盖默认菜单

这段代码会在后台「设置」菜单下新增「菜单权限」页面,管理员可勾选各非管理员角色需要隐藏的菜单,保存后自动生效。

二、插件实现(适合无代码基础的新手)

不想写代码的话,可使用User Role Editor插件:

  • 安装后进入「用户」→「用户角色编辑器」
  • 选择目标角色,切换到「菜单」选项卡,勾选需要隐藏的菜单即可
  • 管理员默认拥有全权限,无需额外调整

内容的提问来源于stack exchange,提问作者kadro larino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:48:19