管理メニュー

PHP

【WordPress】管理画面の各メニュー項目の表示位置(番号)・スラッグを確認する。

更新日:2023/02/13

WordPressの管理画面は自作のメニューを登録できます。
その時に重要なのが、画面左側のメニューのどの位置に挿入するかです。

位置は番号で指定するのですが、既存のメニューの番号がわからないと自分が思った位置に挿入できません。
またサブメニューを追加するとき、親メニューのスラッグが必要です。

そこで今回は、既存メニューの配置位置とスラッグを確認する方法をお伝えします。

 

メニュー情報を保持するグローバル変数

メニューの情報は、グローバル変数の$menuおよび、$submenuで保持されています。

$menu

グローバル変数の$menuは、親メニューの情報を保持しています。

$menuは表示位置をキーとして、次の配列を値に持ちます。

$menu[表示位置] = array(
    メニュータイトル,
    権限,
    メニュースラッグ,
    ページタイトル,
    liタグのクラス,
    フック名,
    アイコンURL
)

表示位置について

add_menu_page()で既存メニューと同じ位置を指定した場合、既存メニューの後ろに挿入されます。
その際に追加したメニューの表示位置は、小数が加算されます。

コールバック関数について

管理画面の内容を表示するコールバック関数は、ここには含まれていません。
add_menu_page()関数内で次のようなコードを実行することで、アクションとしてコールバック関数を呼び出すからです。

add_action( フック名, コールバック関数 );

$submenu

グローバル変数の$submenuは、サブメニューの情報を保持しています。

$submenuは親ページのスラッグをキーとして、番号をキーとする連想配列を持ちます。
連想配列の値は、次のような配列です。

$submenu[親スラッグ][番号] =  array(
    メニュータイトル,
    権限,
    メニュースラッグ,
    ページタイトル,
)

表示位置について

番号はデフォルトでは5,10,15など間隔を持って設定されていますが、表示位置として使用するのは最初の要素を0とした連番です。

この番号はadd_submenu_page()を呼び出すと0からの連番に付け替えられます。(最後尾に追加した場合は、付け替えられません)

add_submenu_page()で既存メニューと同じ位置を指定した場合、既存メニューの前に挿入されます。
位置に小数を指定すると切り捨てて整数にキャストされ、同様に既存メニューの前に挿入されます。

ただし、最後の位置よりも大きい小数値を指定した場合は、最後尾に追加されます。

コールバック関数について

サブメニューも親メニューと同様に、アクションフックで呼び出されます。
この連想配列にフック名が含まれていませんが、メニュースラッグと親のスラッグからフック名が生成されます。

 

確認用コード例

各メニュー項目の表示位置を確認してみます。

add_action('admin_footer',function(){
	global $menu,$submenu;
	echo '<pre class="menu_item_confirm">';
	foreach($menu as $key => $m){
		$slug = $m[2];
		echo '['.$key.']slug['.esc_html($slug).']title['.esc_html($m[0])."]\n";
		if( isset( $submenu[$slug] )){
			$count = 0;
			foreach($submenu[$slug] as $position => $sub){
				echo '    ['.$count++.']→slug:['.esc_html($sub[2]).']title['.esc_html($sub[0])."]\n";
			}
		}
	}
	?>
	</pre>
	<style>
		.menu_item_confirm{ width: 500px;margin: 0  auto;white-space:pre;}
	</style>
	<?php
});

今回はadmin_footerアクションで$menuの内容をリストアップしてみました。
スタイル設定しているのは、設定しないとメニューの黒いバーに重なって見えないからです。

WordPres6.1のデフォルト状態で実行したところ、次のような結果になりました。

[2]slug[index.php]title[ダッシュボード]
    [0]slug:[index.php]title[ホーム]
    [1]slug:[update-core.php]title[更新 &lt;span class=&quot;update-plugins count-1&quot;&gt;&lt;span class=&quot;update-count&quot;&gt;1&lt;/span&gt;&lt;/span&gt;]

[4]slug[separator1]title[]

[5]slug[edit.php]title[投稿]
    [0]slug:[edit.php]title[投稿一覧]
    [1]slug:[post-new.php]title[新規追加]
    [2]slug:[edit-tags.php?taxonomy=category]title[カテゴリー]
    [3]slug:[edit-tags.php?taxonomy=post_tag]title[タグ]

[10]slug[upload.php]title[メディア]
    [0]slug:[upload.php]title[ライブラリ]
    [1]slug:[media-new.php]title[新規追加]

[20]slug[edit.php?post_type=page]title[固定ページ]
    [0]slug:[edit.php?post_type=page]title[固定ページ一覧]
    [1]slug:[post-new.php?post_type=page]title[新規追加]

[25]slug[edit-comments.php]title[コメント &lt;span class=&quot;awaiting-mod count-0&quot;&gt;&lt;span class=&quot;pending-count&quot; aria-hidden=&quot;true&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;comments-in-moderation-text screen-reader-text&quot;&gt;0件のコメントが承認待ちです&lt;/span&gt;&lt;/span&gt;]
    [0]slug:[edit-comments.php]title[コメント一覧]

[59]slug[separator2]title[]

[60]slug[themes.php]title[外観]
    [0]slug:[themes.php]title[テーマ 0</span>]
    [1]slug:[customize.php?return=%2Fwordpress%2Fwp-admin%2Findex.php]title[カスタマイズ]
    [2]slug:[widgets.php]title[ウィジェット]
    [3]slug:[nav-menus.php]title[メニュー]
    [4]slug:[theme-editor.php]title[テーマファイルエディター]


[65]slug[plugins.php]title[プラグイン &lt;span class=&quot;update-plugins count-1&quot;&gt;&lt;span class=&quot;plugin-count&quot;&gt;1&lt;/span&gt;&lt;/span&gt;]
    [0]slug:[plugins.php]title[インストール済みプラグイン]
    [1]slug:[plugin-install.php]title[新規追加]
    [2]slug:[plugin-editor.php]title[プラグインファイルエディター]

[70]slug[users.php]title[ユーザー]
    [0]slug:[users.php]title[ユーザー一覧]
    [1]slug:[user-new.php]title[新規追加]
    [2]slug:[profile.php]title[プロフィール]

[75]slug[tools.php]title[ツール]
    [0]slug:[tools.php]title[利用可能なツール]
    [1]slug:[import.php]title[インポート]
    [2]slug:[export.php]title[エクスポート]
    [3]slug:[site-health.php]title[サイトヘルス 1</span>]
    [4]slug:[export-personal-data.php]title[個人データのエクスポート]
    [5]slug:[erase-personal-data.php]title[個人データの消去]

[80]slug[options-general.php]title[設定]
    [0]slug:[options-general.php]title[一般]
    [1]slug:[options-writing.php]title[投稿設定]
    [2]slug:[options-reading.php]title[表示設定]
    [3]slug:[options-discussion.php]title[ディスカッション]
    [4]slug:[options-media.php]title[メディア]
    [5]slug:[options-permalink.php]title[パーマリンク]
    [6]slug:[options-privacy.php]title[プライバシー]

デフォルト状態で表示されないものも、少し入っています。

メニュー名はhtmlのタグが入っても、いいんですね。
知りませんでした。

 

確認結果の使用例

例えば新規メニューを『ダッシュボード』の直後に挿入したいときは、『ダッシュボード』の位置が2なので、3を指定します。

位置3に新規メニューを挿入

add_menu_page( '新規メニュー' , '新規メニュー' , 'manage_options' , 'my_new_menu'
			  , 'echo_my_new_menu' , '' , 3 );

『投稿』のカテゴリーとタグの間にサブページを挿入したいときは、タグと同じ位置を指定します。

位置3に新規サブメニューを挿入

add_posts_page( '新規サブメニュー' , '新規サブメニュー' , 'manage_options' , 'my_new_sub_menu'
			  , 'echo_my_new_sub_menu' , 3 );

add_posts_page()は『投稿』メニューにサブメニューを追加する関数です。
詳しくは、次のページを読んでみてください。

WordPressはHTMやCSSの知識も必要。総合的な知識を身につけよう。

更新日:2023/02/13

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。