[WordPress]プラグインでadminmenuを追加する方法

adminmenuというのは、WordPressの管理画面で左側に表示されているメニューのことです。

プラグインをインストールするとこの中にメニューを追加するものがありますが、これはどのようにすればよいのでしょうか。

テスト用のプラグインを作ってグローバル変数 $menu と $submenu をダンプしてみると、第1階層と第2階層のメニューがそれぞれ定義されているようです。

WPMUの場合 $menuは

[0] =>ダッシュボード(index.php)
[1] =>wp-menu-separator
[2] =>サイト管理(wpmu-admin.php)
[4] =>wp-menu-separator
[5] =>投稿(edit.php)
[10] =>メディア(upload.php)
[15] =>リンク(link-manager.php)
[20] =>ページ(edit-pages.php)
[25] =>コメント(edit-comments.php)
[39] =>wp-menu-separator
[40] =>外観(themes.php)
[45] =>プラグイン(plugins.php)
[50] =>ユーザー(users.php)
[55] =>ツール(tools.php)
[60] =>設定(options-general.php)
[79] =>wp-menu-separator-last

という状態。セパレーターが「wp-menu-separator」と「wp-menu-separator-last」という2種類あるのはメニューを小さくするバーがあるかないかの違いくらいしかわかりません。

便利なことに、きちんと解説のページも出来ています。
Adding Administration Menus – WordPress Codex 日本語版

先にここを読んでおけばよかったのですが、ワタシが調べたのはこんな方法。

%fgrep -n “do_action” -r . | grep menu ./wp-admin/menu.php:111:do_action(‘_admin_menu’); ./wp-admin/menu.php:162:do_action(‘admin_menu’, ”); ./wp-admin/menu.php:243:        do_action(‘admin_page_access_denied’); ./wp-admin/menu-header.php:146:do_action( ‘adminmenu’ );

調べてみると、「_admin_menu」「admin_menu」「adminmenu」の順にアクションが実行されますが、wp-admin/menu-header.php をみると

145 _wp_menu_output( $menu, $submenu ); 146 do_action( ‘adminmenu’ );

となっています。_wp_menu_outputで出力してしまうのでadminmenu では間に合わなさそうです。

ふつうは admin_menu でadmin_menu_page で定義するものでしょうけど、そうするとインデックスが80番からになってしまい、よく使うものとしてはあまりふさわしくありません。

任意の場所に入れるには$menuをセットすれば十分なように思います。

ワタシはコメントの下の30番台が空いているのが気になるので、ここへセパレーターをはさんで独立したメニューを追加したいと思います。

セパレーターの場合は

$menu[$emptyindex] = array(null,’read’, null, null, ‘wp-menu-separator’);

メニューの場合は

$menu[$emptyindex] = array(‘menu_title’,’access_level/capability’,’file’,’page_title’, ‘CSSのclass’,’function’, ‘icon_url’);

となります。add_menu_pageと引数の並びや内容が少し違います。

メニューの並びを変えるのは意外と簡単ですね。ひょっとしたら汎用的なプラグインがあるかもしれませんが、探して動作検証するのも結構大変なので(WPMU用のカスタマイズ+多言語化もありますし)そんなに手間ではないので、適当な関数を作って終わりにしたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です