2026年5月20日

2026年5月20日

WordPressの管理画面メニューを特定のロールに制限する方法

はじめに

WordPressの管理画面は全メニューが表示されますが、ロールによって不要なメニューを非表示にすることで、操作ミスを防ぎユーザビリティを向上させることができます。

メニューを非表示にする基本

// functions.php
add_action('admin_menu', function() {
    // 編集者以下には以下のメニューを非表示
    if (!current_user_can('manage_options')) {
        remove_menu_page('tools.php');           // ツール
        remove_menu_page('options-general.php'); // 設定
        remove_menu_page('plugins.php');         // プラグイン
        remove_menu_page('themes.php');          // 外観
        remove_menu_page('users.php');           // ユーザー
        remove_menu_page('edit-comments.php');   // コメント(不要な場合)
    }
});

サブメニューのみを非表示

add_action('admin_menu', function() {
    if (!current_user_can('manage_options')) {
        // 外観のサブメニューを制限
        remove_submenu_page('themes.php', 'themes.php');       // テーマ
        remove_submenu_page('themes.php', 'widgets.php');      // ウィジェット
        remove_submenu_page('themes.php', 'nav-menus.php');    // メニュー

        // 設定のサブメニューを制限
        remove_submenu_page('options-general.php', 'options-discussion.php');
        remove_submenu_page('options-general.php', 'options-permalink.php');
    }
});

ロール別にメニューを細かく制御

// functions.php — ロール別メニュー制御
add_action('admin_menu', function() {
    $user = wp_get_current_user();
    $roles = (array) $user->roles;

    if (in_array('author', $roles)) {
        // 投稿者: ツール・設定・プラグイン・外観を非表示
        remove_menu_page('tools.php');
        remove_menu_page('options-general.php');
        remove_menu_page('plugins.php');
        remove_menu_page('themes.php');
        remove_menu_page('users.php');
    }

    if (in_array('editor', $roles)) {
        // 編集者: プラグイン・外観・設定のみ非表示
        remove_menu_page('plugins.php');
        remove_menu_page('themes.php');
        remove_menu_page('options-general.php');
    }
});

カスタムメニューページを追加

// functions.php — 投稿者向けシンプルメニューを追加
add_action('admin_menu', function() {
    if (current_user_can('manage_options')) return;

    add_menu_page(
        '投稿管理',      // ページタイトル
        '記事を書く',    // メニュー名
        'edit_posts',   // 必要権限
        'post-new.php', // スラッグ(既存ページにリンク)
        '',             // コールバック
        'dashicons-edit',
        3
    );
});

メニューの並び順を変更

// functions.php — メニューの順番を変更
add_filter('custom_menu_order', '__return_true');
add_filter('menu_order', function($menu_order) {
    return [
        'index.php',         // ダッシュボード
        'edit.php',          // 投稿
        'upload.php',        // メディア
        'edit.php?post_type=page', // 固定ページ
    ];
});

注意事項

  • メニューの非表示はUIの変更のみ。URLに直接アクセスすれば機能は利用できます
  • 真のアクセス制限には current_user_can() を各機能内で使用してください
  • プラグインが追加するメニューのスラッグはプラグインのソースから確認してください

まとめ

admin_menu フックで remove_menu_page()remove_submenu_page() を使い、current_user_can() でロールを判定してメニューを非表示にします。投稿者には記事作成に必要なメニューのみを残すのがベストプラクティスです。

お気軽にご相談ください

お見積りへ お問い合わせへ