WordPress管理画面のサイドメニュー項目をカスタマイズする

WordPressの管理画面の左側に表示されるメニュー項目のカスタマイズメモです。

メニュー項目をカスタマイズする際に必要になるのが、メニューに付けられている番号やスラッグの情報です。

既存メニューの番号が分からないと思った通りの位置に追加することができず、スラッグが分からないとそのメニューの変更ができません。確認できるようにしておくと実装がスムーズに進みます。

【表示番号やスラッグを確認、出力されたコード】(WordPressバージョン6.4.2で確認)

[2]slug[index.php]title[ダッシュボード]
      [0]→slug:[index.php]title[ホーム]
      [10]→slug:[update-core.php]title[更新 <span class="update-plugins count-0"><span class="update-count">0</span></span>]
[4]slug[separator1]title[]
[5]slug[edit.php]title[投稿]
      [5]→slug:[edit.php]title[投稿一覧]
      [10]→slug:[post-new.php]title[新規投稿を追加]
      [15]→slug:[edit-tags.php?taxonomy=category]title[カテゴリー]
      [16]→slug:[edit-tags.php?taxonomy=post_tag]title[タグ]
[10]slug[upload.php]title[メディア]
      [5]→slug:[upload.php]title[ライブラリ]
      [10]→slug:[media-new.php]title[新しいメディアファイルを追加]
[20]slug[edit.php?post_type=page]title[固定ページ]
      [5]→slug:[edit.php?post_type=page]title[固定ページ一覧]
      [10]→slug:[post-new.php?post_type=page]title[新規固定ページを追加]
[59]slug[separator2]title[]
[60]slug[themes.php]title[外観]
      [5]→slug:[themes.php]title[テーマ <span class="update-plugins count-0"><span class="theme-count">0</span></span>]
      [6]→slug:[customize.php?return=%2Fwp-admin%2Fadmin.php%3Fpage%3Dcheck-main-menu]title[カスタマイズ]
      [7]→slug:[widgets.php]title[ウィジェット]
      [10]→slug:[nav-menus.php]title[メニュー]
      [11]→slug:[theme-editor.php]title[テーマファイルエディター]
[65]slug[plugins.php]title[プラグイン <span class="update-plugins count-0"><span class="plugin-count">0</span></span>]
      [5]→slug:[plugins.php]title[インストール済みプラグイン]
      [10]→slug:[plugin-install.php]title[新規プラグインを追加]
      [15]→slug:[plugin-editor.php]title[プラグインファイルエディター]
[70]slug[users.php]title[ユーザー]
      [5]→slug:[users.php]title[ユーザー一覧]
      [10]→slug:[user-new.php]title[新規ユーザーを追加]
      [15]→slug:[profile.php]title[プロフィール]
[75]slug[tools.php]title[ツール]
      [5]→slug:[tools.php]title[利用可能なツール]
      [10]→slug:[import.php]title[インポート]
      [15]→slug:[export.php]title[エクスポート]
      [20]→slug:[site-health.php]title[サイトヘルス <span class="menu-counter site-health-counter count-0"><span class="count">0</span></span>]
      [25]→slug:[export-personal-data.php]title[個人データのエクスポート]
      [30]→slug:[erase-personal-data.php]title[個人データの消去]
[80]slug[options-general.php]title[設定]
      [10]→slug:[options-general.php]title[一般]
      [15]→slug:[options-writing.php]title[投稿設定]
      [20]→slug:[options-reading.php]title[表示設定]
      [25]→slug:[options-discussion.php]title[ディスカッション]
      [30]→slug:[options-media.php]title[メディア]
      [40]→slug:[options-permalink.php]title[パーマリンク]
      [45]→slug:[options-privacy.php]title[プライバシー]
[99]slug[separator-last]title[]

メニュー項目の中には全く使わないものがあるかもしれません。あっても使わない項目はない方がすっきりしますし、余計なものがない方が使いやすいです。
またあまり知識のない人が、重要なところをうっかり変更して問題が出てしまった…なんていうことを未然に防ぐこともできます。

メニューの非表示にはremove_menu_page() という関数使用します。

function remove_admin_menu() {
  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_menu');

上記のコードのようにすべて設定するとメニュー欄に何もなくなります。

サブメニューの中の一つを非表示にしたい場合は remove_submenu_page() を使用します。

function remove_admin_submenu() {
  remove_submenu_page('index.php', 'index.php'); // ホーム
  remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=post_tag'); // 投稿のタグ
}
add_action( 'admin_menu', 'remove_admin_submenu' );

unset() を使用して削除することもできます。このコードを利用する場合は引数にグローバル変数 $menu を使ってメニュー番号を指定します。

function remove_admin_menu() {
  global $menu;
  unset($menu[2]);  // ダッシュボード
}
add_action('admin_menu', 'remove_admin_menu');

サブメニューの場合は $submenu を使って、親メニューのスラッグとサブメニュー番号を指定します。

function remove_admin_submenu() {
  global $submenu;
  unset($submenu['plugins.php'][10]); // 新規プラグインを追加
  unset($submenu['options-general.php'][40]); // パーマリンク
}
add_action('admin_menu', 'remove_admin_submenu');

各メニューの表示番号やスラッグ

ユーザーごとに表示を切り替えたい場合は、条件分岐をつけます。

function custom_admin_menu() {  
  $user = wp_get_current_user();
  $post_user = 'post_user_ID';
  if($user->get('user_login') == $post_user) {
    remove_menu_page('options-general.php'); // 設定
  }
}
add_action('admin_menu', 'custom_admin_menu');

ユーザーIDがわからない時はユーザーページで確認できます。
ユーザーページにアクセスするとURLにID番号があるのでそちらを確認してください。「user_id=数字」の数字がユーザーIDです。

WordPressでは各ユーザーに「管理画面上で何ができるか」という権限を設定することができます。上記のようにコードを書くことによってメニュー項目を制限することもできますが、ユーザー登録の際に設定する権限によって制限させることもできます。

メニューのテキストを変更する

デフォルトで存在するメニューのテキストを変更するには、グローバル変数の $menu$submenu を利用して設定します。それぞれにメニューに表示される内容が入っています。

メニュー名を変更する

メニュー名は任意のテキストに変更できます。例えばメニューにある「投稿」を「記事作成」という名前にしたい場合、以下のようなコードを追加することで変更されます。

function edit_admin_menu_text() {
  global $menu, $submenu;
  $menu[5][0] = '記事作成';  // 投稿
  $submenu['edit.php'][5][0] = '記事一覧';  // 投稿一覧
  $submenu['edit.php'][10][0] = '記事新規追加';  // 新規追加
  $menu[10][0] = '画像追加';
}
add_action('admin_menu', 'edit_admin_menu_text');

$menu[5][0] の [5] はメニュー番号、[0] で「投稿」といったテキストが格納されている場所を指定しています。
$submenu はメニュー番号の前にキーとして入っている親メニューのphpファイル名を指定します。

配列の情報は、var_dump($menu);var_dump($submenu); で確認できます。
メニュー項目の番号はこちらでも参照できます。
各メニューの表示番号やスラッグ

メニュー順序を変更する

メニューの順序を変更したい場合は custom_menu_ordermenu_order というフィルターフックを利用します。

並べ替える前の中身は var_dump($menu_order); で確認できます。こちらを元に並べ替えたい順序でメニューを記述していきます。

例えば投稿やメディアをダッシュボードより前に表示させたい場合は以下のように記述します。

function my_menu_order($menu_order) {
  return array(
    'edit.php', // 投稿
    'upload.php', // メディア
    'index.php', // ダッシュボード
    'edit.php?post_type=page', // 固定ページ
    'edit-comments.php', // コメント
    'separator1', // 区切り線1
    'link-manager.php', // リンク
    'users.php', // ユーザー
    'separator2', // 区切り線2
    'themes.php', // テーマ
    'plugins.php', // プラグイン
    'tools.php', // ツール
    'options-general.php', // 設定
    'separator-last', // 区切り線3
  );
}
add_filter('custom_menu_order', '__return_true');
add_filter('menu_order', 'my_menu_order');
add_filter('custom_menu_order', '__return_true');

add_filter('custom_menu_order', '__return_true'); でメニュー順序の変更を有効にし、add_filter('menu_order', 'my_menu_order'); で順序変更の設定を反映させています。

この場合、メニューの上部2つを変えたいだけなので、全て書かずその部分だけでもOKです。

function my_menu_order($menu_order) {
  return array(
    'edit.php', // 投稿
    'upload.php', // メディア
  );
}
add_filter('custom_menu_order', '__return_true');
add_filter('menu_order', 'my_menu_order');

独自メニューを追加する

メニューの追加

add_menu_page を使って独自のメニュー項目を作ることができます。

function custom_menu_page() {
  add_menu_page('追加メニュー項目', '追加メニュー', 'manage_options', 'custom-menu-page', 'custom_menu_text', 'dashicons-admin-generic', 100);
}

add_menu_page() で設定する引数は以下のものです。

add_menu_page(
  $page_title,
  $menu_title,
  $capability,
  $menu_slug,
  $function,
  $icon_url,
  $position
);
$page_titleリンク先のメニューページのタイトルタグのテキスト。
$menu_titleサイドのメニューリストに表示されるテキスト。
$capabilityユーザー権限を設定。
ここで設定した権限レベル以上のユーザーにメニューを表示させる。
$menu_slugリンク先のメニューページのスラッグ。
$functionリンク先のページにアクセスした際に実行する内容。
$icon_urlメニューテキストにつけるアイコン。
画像のURLやダッシュコンなどが使用可能。
$position追加するメニューの表示位置。
数字が小さければ上部に、大きいほど下に表示される。

メニューのコンテンツを作る

メニューの画面を出力するのは先述した $function の部分です。表示させたい内容をHTMLで作成していきます。

設定を保存できるようにするにはformタグでマークアップし、submit_button() を設置します。

【参考】【WordPress】管理画面に独自の設定画面を追加する方法 – よしあかつきのメモ帳

サブメニューの追加

メニューに階層を作る場合は add_submenu_page を使用します。設定する引数は以下のものです。

add_submenu_page(
  $parent_slug,
  $page_title,
  $menu_title,
  $capability,
  $menu_slug,
  $function,
);

add_submenu_page を利用して投稿や固定ページなどデフォルトのメニューの中に独自メニューを追加することもできます。$parent_slug に既存のメニューを指定することでその中に追加されます。

カテゴリー : WordPress

TOPへ