2026年5月20日

2026年5月20日

WordPress管理画面のメニューを権限別に非表示にする方法|remove_menu_pageと直接アクセスの制限

WordPress の管理画面では、ユーザーの権限グループ(ロール)が持つ権限(capability)に応じて、表示されるメニューが決まります。たとえば「プラグイン」は activate_plugins、「設定」は manage_options の権限が必要なので、編集者や投稿者にはもともと表示されず、URL を直接開いても、権限が無いことを知らせるメッセージが表示されて開けません。

一方、「ツール」や「コメント」は edit_posts の権限で開けるため、投稿者以上のユーザーには表示されます。この記事では、こうした「権限上は開けるが、見せたくないメニュー」を整理する方法を説明します。内容は 2026年11月時点の WordPress 6.9 のソースコードで確認しています。

主なメニューのスラッグと必要な権限

メニューを消すときは、メニューの「スラッグ」(管理画面の URL の /wp-admin/ より後ろの部分)を指定します。

メニュー スラッグ 表示に必要な権限
ダッシュボード index.php read
投稿 edit.php edit_posts
メディア upload.php upload_files
固定ページ edit.php?post_type=page edit_pages
コメント edit-comments.php edit_posts
外観 themes.php switch_themes または edit_theme_options
プラグイン plugins.php activate_plugins
ユーザー users.php list_users
プロフィール(ユーザー一覧を見られない人の場合) profile.php read
ツール tools.php edit_posts
設定 options-general.php manage_options

カスタム投稿タイプのメニューは edit.php?post_type=投稿タイプ名、プラグインが追加したメニューは admin.php?page=xxx の xxx の部分がスラッグです。

1. メニューを非表示にする

次のコードは、管理者(manage_options の権限を持つユーザー)以外に「ツール」と「コメント」を表示しないようにします。子テーマの functions.php か、wp-content/mu-plugins/ に置いた PHP ファイルに書きます。

<?php
add_action( 'admin_menu', function () {
    if ( current_user_can( 'manage_options' ) ) {
        return; // 管理者には全部表示する
    }

    // トップレベルのメニューを消す
    remove_menu_page( 'tools.php' );          // ツール
    remove_menu_page( 'edit-comments.php' );  // コメント

    // サブメニューだけを消す例(投稿 → タグ)
    remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=post_tag' );
}, 999 );

最後の 999 は実行の優先度です。プラグインが追加したメニューは、そのプラグインが admin_menu で登録した後でないと消せないため、大きい数字にして後から実行します。

remove_submenu_page() の1つ目は親メニューのスラッグ、2つ目はサブメニューのスラッグです。

2. URL を直接開かれたときに止める

remove_menu_page() はメニューから項目を消すだけで、そのページへのアクセスは制限しません。URL を知っていれば、/wp-admin/tools.php を直接開けます。止めたい場合は、管理画面の読み込み時に現在のページを調べて処理を中断します。

<?php
add_action( 'admin_init', function () {
    if ( current_user_can( 'manage_options' ) || wp_doing_ajax() ) {
        return;
    }

    global $pagenow;

    $blocked_pages = array( 'tools.php', 'edit-comments.php' );

    if ( in_array( $pagenow, $blocked_pages, true ) ) {
        wp_die(
            esc_html( 'このページを表示する権限がありません。' ),
            '',
            array( 'response' => 403, 'back_link' => true )
        );
    }
} );

$pagenow には、開いている管理画面のファイル名(tools.php など)が入っています。プラグインのページ(admin.php?page=xxx)を止めるときは、'admin.php' === $pagenow で、かつ $_GET['page'] の値が対象のスラッグかを調べます。

wp_doing_ajax() の判定は、admin-ajax.php を使うプラグインの処理を止めないために入れています。ダッシュボードに戻したい場合は、wp_die() の代わりに wp_safe_redirect( admin_url() ); exit; を使います。

3. ダッシュボードのウィジェットを非表示にする

ダッシュボードに表示される標準のウィジェットは、wp_dashboard_setup のフックで remove_meta_box() を使って消せます。

<?php
add_action( 'wp_dashboard_setup', function () {
    if ( current_user_can( 'manage_options' ) ) {
        return;
    }
    remove_meta_box( 'dashboard_site_health', 'dashboard', 'normal' ); // サイトヘルスステータス
    remove_meta_box( 'dashboard_right_now',   'dashboard', 'normal' ); // 概要
    remove_meta_box( 'dashboard_activity',    'dashboard', 'normal' ); // アクティビティ
    remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );   // クイックドラフト
    remove_meta_box( 'dashboard_primary',     'dashboard', 'side' );   // WordPress イベントとニュース
} );

3つ目の引数は、ウィジェットが置かれている場所です。標準では「クイックドラフト」と「WordPress イベントとニュース」が side、それ以外が normal です。

メニューのスラッグを調べる

いちばん簡単なのは、管理画面でメニューにマウスを重ね、リンク先の URL を見る方法です。/wp-admin/ より後ろの部分がスラッグです。

プラグインが追加したメニューをまとめて確認したい場合は、wp-config.php で WP_DEBUG と WP_DEBUG_LOG を有効にしたうえで、次のコードを一時的に追加し、管理者で管理画面を開きます。スラッグの一覧が wp-content/debug.log に書き出されます。

<?php
add_action( 'admin_menu', function () {
    global $menu, $submenu;
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    error_log( print_r( wp_list_pluck( $menu, 2 ), true ) );       // トップレベル
    error_log( print_r( array_map( function ( $items ) {
        return wp_list_pluck( $items, 2 );
    }, $submenu ), true ) );                                           // サブメニュー
}, PHP_INT_MAX );

管理画面のメニューは、管理画面を開いたときにだけ組み立てられます。WP-CLI の wp eval で $menu を表示しようとしても、中身は空です。確認が終わったら、このコードは消してください。

権限そのものを外す方法

「見せない」だけでなく「その操作をさせない」ことが目的なら、メニューを消すのではなく、ロールから権限を外します。たとえば、編集者からコメントを承認・削除する権限を外す場合は、WP-CLI で次のように実行します。

wp cap remove editor moderate_comments

ロールの権限の変更はデータベースに保存され、元に戻すまで続きます。PHP で add_cap() や remove_cap() を使う場合も同じで、ページを開くたびに実行するコードにはしないでください。権限の仕組みは次の記事で説明しています。

注意点

  • メニューを消しても、REST API や他の画面から同じ操作ができる場合があります。操作そのものを止めたいときは、上の「権限そのものを外す方法」を使ってください。
  • 管理者を判定する条件を間違えると、管理者自身のメニューも消えます。functions.php を編集する前に、FTP やファイルマネージャーで元に戻せる状態にしておきます。
  • テーマを変えると functions.php のコードは効かなくなります。テーマに関係なく残したい場合は wp-content/mu-plugins/ に置きます。

お気軽にご相談ください

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