特定のユーザーに管理画面の固定ページメニューを見せたくない場合の方法を解説します。あわせて、メニューを隠すだけでは編集自体は防げないという重要な注意点と、本当に制限する方法も紹介します。
この記事でわかること
- 固定ページメニュー(サブメニュー含む)を非表示にする方法
- メニューを隠すだけでは編集を防げないという事実
add_cap($cap, false)による本当の権限制限
remove_menu_page()はメニューを隠すだけ
メニューを消してもURLを直接開けば編集できてしまう
WordPressコアの
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管理者以外のユーザーから管理画面メニューの固定ページ編集を削除するには?
A
admin_menuアクションでcurrent_user_can('administrator')をチェックし、管理者でない場合にremove_menu_page('edit.php?post_type=page')を実行します。ただしこれは表示を隠すだけです。Qメニューを非表示にするだけでURLから直接アクセスされる危険はありますか?
A
remove_menu_page()はUIからのアクセスを隠すだけで、直接URLでのアクセスは防げません。edit_pages権限を保持したままのユーザーは、URLを直接開けば普通に編集できてしまいます。add_cap($cap, false)による権限無効化と組み合わせて使う必要があります。Q管理画面のサイドメニューにカスタムメニュー項目を追加するには?
A
add_menu_page()またはadd_submenu_page()をadmin_menuアクションフック内で呼び出します。メニュー名・スラッグ・コールバック関数・アイコン・位置を指定します。まとめ
- メニュー非表示:
remove_menu_page()/$submenu操作 - 注意:メニューを隠しても
edit_pages権限があれば直接URLで編集できてしまう - 本当の制限:
add_cap($cap, false)で権限そのものを無効化する
「見た目を整理したいだけ」なのか「本当に編集できないようにしたい」のかを区別し、後者の場合は必ず権限の無効化までセットで行ってください。
