【WordPress】管理画面のメニューをユーザー権限に応じて消す方法

WordPress

nayamu_boy2

「WordPress管理画面のメニューを非表示にしたい」
「メニューを管理者以外に触らせたくない」

このような方向けに。

WordPress管理画面で特定のメニューを非表示にしたり、ユーザーの権限レベルに応じて表示を切り替える方法をご紹介します。

WordPress管理画面のメニューを消す方法

WordPress管理画面のメニューには「サイドメニュー」と「アドミンバー」の2つのメニューエリアがありますが、それぞれの消し方をご紹介します。

function.phpを編集していきます。

サイドバーのメニューを消す方法

サイドメニュー
サイドバーのメニューを消すには、admin_menuフックを利用します。

削除したいメニューをremove_menu_page('メニュー名')で指定します。


function remove_admin_menus() {
    remove_menu_page( 'index.php' ); // ダッシュボード.
    remove_menu_page( 'edit.php' ); // 投稿.
    remove_menu_page( 'upload.php' ); // メディア.
    remove_menu_page( 'edit.php?post_type=page' ); // 固定.
    remove_menu_page( 'edit-comments.php' ); // コメント.
    remove_menu_page( 'themes.php' ); // 外観.
    remove_menu_page( 'plugins.php' ); // プラグイン.
    remove_menu_page( 'users.php' ); // ユーザー.
    remove_menu_page( 'tools.php' ); // ツール.
    remove_menu_page( 'options-general.php' ); // 設定.
}
add_action( 'admin_menu', 'remove_admin_menus', 999 );

サブメニューだけ消したい場合

サブメニュー
特定のサブメニューだけ消したい場合は、remove_submenu_page('メニュー名','サブメニュー名')を使います。


function remove_admin_menus() {
    remove_submenu_page( 'index.php', 'index.php' ); // ダッシュボード / ホーム.
    remove_submenu_page( 'index.php', 'update-core.php' ); // ダッシュボード / 更新.

    remove_submenu_page( 'edit.php', 'edit.php' ); // 投稿 / 投稿一覧.
    remove_submenu_page( 'edit.php', 'post-new.php' ); // 投稿 / 新規追加.
    remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=category' ); // 投稿 / カテゴリー.
    remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=post_tag' ); // 投稿 / タグ.

    remove_submenu_page( 'upload.php', 'upload.php' ); // メディア / ライブラリ.
    remove_submenu_page( 'upload.php', 'media-new.php' ); // メディア / 新規追加.

    remove_submenu_page( 'edit.php?post_type=page', 'edit.php?post_type=page' ); // 固定 / 固定ページ一覧.
    remove_submenu_page( 'edit.php?post_type=page', 'post-new.php?post_type=page' ); // 固定 / 新規追加.

    remove_submenu_page( 'themes.php', 'themes.php' ); // 外観 / テーマ.
    remove_submenu_page( 'themes.php', 'customize.php?return=' . rawurlencode( $_SERVER['REQUEST_URI'] ) ); // 外観 / カスタマイズ.
    remove_submenu_page( 'themes.php', 'nav-menus.php' ); // 外観 / メニュー.
    remove_submenu_page( 'themes.php', 'widgets.php' ); // 外観 / ウィジェット.
    remove_submenu_page( 'themes.php', 'theme-editor.php' ); // 外観 / テーマエディタ.

    remove_submenu_page( 'plugins.php', 'plugins.php' ); // プラグイン / インストール済みプラグイン.
    remove_submenu_page( 'plugins.php', 'plugin-install.php' ); // プラグイン / 新規追加.
    remove_submenu_page( 'plugins.php', 'plugin-editor.php' ); // プラグイン / プラグインエディタ.

    remove_submenu_page( 'users.php', 'users.php' ); // ユーザー / ユーザー一覧.
    remove_submenu_page( 'users.php', 'user-new.php' ); // ユーザー / 新規追加.
    remove_submenu_page( 'users.php', 'profile.php' ); // ユーザー / あなたのプロフィール.

    remove_submenu_page( 'tools.php', 'tools.php' ); // ツール / 利用可能なツール.
    remove_submenu_page( 'tools.php', 'import.php' ); // ツール / インポート.
    remove_submenu_page( 'tools.php', 'export.php' ); // ツール / エクスポート.
    remove_submenu_page( 'tools.php', 'site-health.php' ); // ツール / サイトヘルス.
    remove_submenu_page( 'tools.php', 'export_personal_data' ); // ツール / 個人データのエクスポート.
    remove_submenu_page( 'tools.php', 'remove_personal_data' ); // ツール / 個人データの消去.

    remove_submenu_page( 'options-general.php', 'options-general.php' ); // 設定 / 一般.
    remove_submenu_page( 'options-general.php', 'options-writing.php' ); // 設定 / 投稿設定.
    remove_submenu_page( 'options-general.php', 'options-reading.php' ); // 設定 / 表示設定.
    remove_submenu_page( 'options-general.php', 'options-discussion.php' ); // 設定 / ディスカッション.
    remove_submenu_page( 'options-general.php', 'options-media.php' ); // 設定 / メディア.
    remove_submenu_page( 'options-general.php', 'options-permalink.php' ); // 設定 / メディア.
    remove_submenu_page( 'options-general.php', 'privacy.php' ); // 設定 / プライバシー.
}
add_action( 'admin_menu', 'remove_admin_menus', 999 );

プラグインによって作成されるメニューを消したい場合

プラグインによって作成されるメニューを消すには、トップレベルのメニューのaを確認すれば分かります。

admin.php?page=のリンクの場合はpage=以降の値がメニューのスラッグになるのでこちらを指定してあげてください。


function remove_admin_menus() {
  remove_menu_page( 'wpcf7' ); // Contact Form 7.
  remove_menu_page( 'edit.php?post_type=mw-wp-form' ); // MW WP Form.
  remove_menu_page( 'all-in-one-seo-pack/aioseop_class.php' ); // All In One SEO Pack.
  remove_submenu_page( 'tools.php', 'aiosp_import' ); // All In One SEO Pack.
  remove_menu_page( 'wpseo_dashboard' ); // Yoast SEO.
  remove_menu_page( 'jetpack' ); // Jetpack.
  remove_menu_page( 'edit.php?post_type=acf-field-group' ); // Advanced Custom Fields.
  remove_menu_page( 'cptui_main_menu' ); // Custom Post Type UI.
  remove_menu_page( 'backwpup' ); // BackWPup.
  remove_menu_page( 'ai1wm_export' ); // All-in-One WP Migration.
  remove_menu_page( 'advgb_main' ); // Advanced Gutenberg.
  remove_submenu_page( 'options-general.php', 'tinymce-advanced' ); // TinyMCE Advanced.
  remove_submenu_page( 'options-general.php', 'table-of-contents' ); // Table of Contents Plus.
  remove_submenu_page( 'options-general.php', 'duplicatepost' ); // Duplicate Post.
  remove_submenu_page( 'upload.php', 'ewww-image-optimizer-bulk' ); // EWWWW.
  remove_submenu_page( 'options-general.php', 'ewww-image-optimizer/ewww-image-optimizer.php' ); // EWWWW.
}
add_action( 'admin_menu', 'remove_admin_menus', 999 );

アドミンバーのメニューを消す方法

アドミンメニュー
アドミンバーのメニューを消すには、admin_bar_menuをフックを利用します。


function remove_admin_bar_menus( $wp_admin_bar ) {
  $wp_admin_bar->remove_menu( 'my-account' ); // こんにちは、[ユーザー名]さん.
  $wp_admin_bar->remove_menu( 'user-info' ); // ユーザー / [ユーザー名].
  $wp_admin_bar->remove_menu( 'edit-profile' ); // ユーザー / プロフィールを編集.
  $wp_admin_bar->remove_menu( 'logout' ); // ユーザー / ログアウト.

  $wp_admin_bar->remove_menu( 'wp-logo' ); // WordPressロゴ.
  $wp_admin_bar->remove_menu( 'about' ); // WordPressロゴ / WordPressについて.
  $wp_admin_bar->remove_menu( 'wporg' ); // WordPressロゴ / WordPress.org.
  $wp_admin_bar->remove_menu( 'documentation' ); // WordPressロゴ / ドキュメンテーション.
  $wp_admin_bar->remove_menu( 'support-forums' ); // WordPressロゴ / サポート.
  $wp_admin_bar->remove_menu( 'feedback' ); // WordPressロゴ / フィードバック.

  $wp_admin_bar->remove_menu( 'site-name' ); // サイト名.
  $wp_admin_bar->remove_menu( 'view-site' ); // サイト名 / サイトを表示.

  $wp_admin_bar->remove_menu( 'updates' ); // 更新.

  $wp_admin_bar->remove_menu( 'comments' ); // コメント.

  $wp_admin_bar->remove_menu( 'new-content' ); // 新規投稿.
  $wp_admin_bar->remove_menu( 'new-post' ); // 新規投稿 / 投稿.
  $wp_admin_bar->remove_menu( 'new-media' ); // 新規投稿 / メディア.
  $wp_admin_bar->remove_menu( 'new-page' ); // 新規投稿 / 固定.
  $wp_admin_bar->remove_menu( 'new-user' ); // 新規投稿 / ユーザー.

  $wp_admin_bar->remove_menu( 'menu-toggle' ); // メニュー.
}
add_action( 'admin_bar_menu', 'remove_admin_bar_menus', 999 );

プラグインによって作成されるメニューを消したい場合

アドミンバーのメニューのプラグインによって作成されるメニューを消す場合の例を紹介します。


function remove_admin_bar_menus( $wp_admin_bar ) {
  $wp_admin_bar->remove_menu( 'new-mw-wp-form' ); // 新規投稿 / MW WP Form.
  $wp_admin_bar->remove_menu( 'all-in-one-seo-pack' ); // All in One SEO Pack.
}
add_action( 'admin_bar_menu', 'remove_admin_bar_menus', 100000 );
add_filter( 'aioseo_show_in_admin_bar', '__return_false' ); // All in One SEO Pack.

権限に応じて表示するメニューを切り替える

権限に応じて表示するメニューを切り替えるには、if文で条件分けします。

ユーザーの権限は、current_user_can()関数で確認する事ができます。


 if ( current_user_can( 'administrator' ) ) {
    // 管理者の場合
  } elseif ( current_user_can( 'editor' ) ) {
    // 編集者の場合
  } elseif ( current_user_can( 'author' ) ) {
    // 投稿者の場合
  } elseif ( current_user_can( 'contributor' ) ) {
    // 寄稿者の場合
  } elseif ( current_user_can( 'subscriber' ) ) {
    // 購読者の場合
  }

おわりに

WordPress管理画面で特定のメニューを非表示にしたり、ユーザーの権限レベルに応じて表示を切り替える方法をご紹介しました。

誰でもメニューを触れてしまうと、誤って設定を変更してしまいエラーが起きる可能性があるので、ユーザーの権限に応じてメニューの表示・非表示の設定をするようにしましょう。