【WordPress】管理画面のメニューから固定ページを非表示にする方法|本当に制限する方法も解説

特定のユーザーに管理画面の固定ページメニューを見せたくない場合の方法を解説します。あわせて、メニューを隠すだけでは編集自体は防げないという重要な注意点と、本当に制限する方法も紹介します。

この記事でわかること

  • 固定ページメニュー(サブメニュー含む)を非表示にする方法
  • メニューを隠すだけでは編集を防げないという事実
  • add_cap($cap, false) による本当の権限制限
スポンサーリンク

remove_menu_page()はメニューを隠すだけ

メニューを消してもURLを直接開けば編集できてしまう
WordPressコアの wp-admin/edit.php(固定ページ一覧・編集画面)は、current_user_can( $post_type_object->cap->edit_posts )独自に、メニューの表示状態とは無関係にチェックしています。そのため editor ロールなど edit_pages 権限を持ったままのユーザーは、メニューが消えていても /wp-admin/edit.php?post_type=page に直接アクセスすれば普通に固定ページを編集できてしまいます。「メニューを消す=編集を制限する」ではないことに注意してください。本当に制限する方法は、この記事の後半で解説します。

固定ページメニューを非表示にする(基本)

管理者以外のユーザーに固定ページメニューを表示させたくない場合、以下のコードをテーマの functions.php ファイルに追加します。

functions.php:管理者以外は固定ページメニューを非表示
function remove_pages_menu() {
    if ( ! current_user_can( 'administrator' ) ) {
        remove_menu_page( 'edit.php?post_type=page' );
    }
}
add_action( 'admin_menu', 'remove_pages_menu', 999 );

サブメニュー項目だけを非表示にする

固定ページメニュー自体は残し、特定のサブメニュー項目だけを非表示にしたい場合は以下のコードを使用します。

functions.php:特定のサブメニュー項目のみ非表示
function remove_specific_pages_menu() {
    if ( ! current_user_can( 'administrator' ) ) {
        global $submenu;
        unset( $submenu['edit.php?post_type=page'][10] ); // 固定ページ追加
        unset( $submenu['edit.php?post_type=page'][15] ); // 固定ページのカテゴリー
    }
}
add_action( 'admin_menu', 'remove_specific_pages_menu', 999 );

特定のロールに対してだけ非表示にする(複数ロール指定)

複数のロールをまとめて対象にしたい場合は、配列と array_intersect() で判定します。

functions.php:複数ロールを指定して非表示にする
function remove_pages_menu_for_roles() {
    $roles_to_restrict = array( 'editor', 'author' ); // 対象にするロール

    $user = wp_get_current_user();

    if ( array_intersect( $roles_to_restrict, $user->roles ) ) {
        remove_menu_page( 'edit.php?post_type=page' );
    }
}
add_action( 'admin_menu', 'remove_pages_menu_for_roles', 999 );

本当に制限したい場合:権限(Capability)を無効化する

メニューを隠すだけでなく、実際に編集できないようにするには、対象ユーザーの権限そのものを無効化します。WP_User::remove_cap() はロール継承の権限には効かないため、add_cap($cap, false) で明示的に上書きします。この仕組みの詳細は特定ユーザーに管理画面の機能を制限する方法(add_cap()による本当の権限制限)で解説しています。

functions.php:特定ユーザーの固定ページ編集権限を本当に無効化
add_action( 'admin_init', function () {
    $restricted_user_id = 2;
    $target_caps = array( 'edit_pages', 'edit_others_pages', 'publish_pages' );

    $user = get_user_by( 'id', $restricted_user_id );
    if ( ! $user ) {
        return;
    }

    foreach ( $target_caps as $cap ) {
        if ( ! isset( $user->caps[ $cap ] ) || $user->caps[ $cap ] !== false ) {
            $user->add_cap( $cap, false );
        }
    }
} );
さらに厳密にブロックしたい場合
編集画面を開いた瞬間にリダイレクトさせるなど、より能動的にブロックしたい場合は管理者権限以外のユーザーは固定ページを編集できないようにする方法で解説している admin_init フックによるリダイレクト実装が参考になります。

関連する権限制限の実装

よくある質問(FAQ)

Q管理者以外のユーザーから管理画面メニューの固定ページ編集を削除するには?
Aadmin_menuアクションでcurrent_user_can('administrator')をチェックし、管理者でない場合にremove_menu_page('edit.php?post_type=page')を実行します。ただしこれは表示を隠すだけです。
Qメニューを非表示にするだけでURLから直接アクセスされる危険はありますか?
Aremove_menu_page()はUIからのアクセスを隠すだけで、直接URLでのアクセスは防げません。edit_pages権限を保持したままのユーザーは、URLを直接開けば普通に編集できてしまいます。add_cap($cap, false)による権限無効化と組み合わせて使う必要があります。
Q管理画面のサイドメニューにカスタムメニュー項目を追加するには?
Aadd_menu_page()またはadd_submenu_page()admin_menuアクションフック内で呼び出します。メニュー名・スラッグ・コールバック関数・アイコン・位置を指定します。

まとめ

  • メニュー非表示remove_menu_page()$submenu操作
  • 注意:メニューを隠してもedit_pages権限があれば直接URLで編集できてしまう
  • 本当の制限add_cap($cap, false)で権限そのものを無効化する

「見た目を整理したいだけ」なのか「本当に編集できないようにしたい」のかを区別し、後者の場合は必ず権限の無効化までセットで行ってください。