管理画面(ダッシュボード)のメニューの表示/非表示を手動で操作する方法
Webサイト作成後、クライアントに引き渡すとき、管理画面から不要なメニューは表示させたくないと思います。プラグイン「Adminimize」、「User Role Editor」を使う方法もあるのですが、以前これらを使用し、動作がおかしくなったことがあったので使うのをやめました。ここでは functions.php にコードを追加して対応する方法をメモ。
案件内容
・クライアントは「編集者」権限で編集する。
・「管理者」権限意外は一部のメニューを非表示
「remove_menu_page」でメインメニューを削除
remove_menu_page関数を使えば簡単にメインメニューを非表示にすることができます。
下記のコードを何も考えずにfunctions.phpに追加してみます。
function remove_menus() {
remove_menu_page('index.php'); // ダッシュボード
remove_menu_page('separator1'); // セパレータ1 (空間)
remove_menu_page('edit.php'); // 投稿
remove_menu_page('upload.php'); // メディア
remove_menu_page('link-manager.php'); // リンク
remove_menu_page('edit.php?post_type=page'); // 固定ページ
remove_menu_page('edit-comments.php'); // コメント
remove_menu_page('separator2'); // セパレータ2 (空間)
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'); // 設定
remove_menu_page('profile.php'); // プロフィール(管理者以外のユーザー用)
}
add_action('admin_menu', 'remove_menus');
すると、メニューが消えました。これを見るとなんとなく引数を指定すればメニューが消えることがわかります。
ではこの引数は何を指定すればいいの?
「remove_menu_page」の中身を見てみる
/wp-admin/includes/plugin.php にremove_menu_page があるので見てみると
function remove_menu_page( $menu_slug ) {
global $menu;
foreach ( $menu as $i => $item ) {
if ( $menu_slug == $item[2] ) {
unset( $menu[$i] );
return $item;
}
}
return false;
}
となっていて$menu配列の[2]の値と引数が一致したメニューを削除していることがわかります。 そこで、下記のようにして、$menuを表示させてみると、
global $menu;
echo "<pre>";
print_r($menu);
echo "</pre>";
以下のように表示されます。
Array
(
[2] => Array
(
[0] => ダッシュボード
[1] => read
[2] => index.php
[3] =>
[4] => menu-top menu-top-first menu-icon-dashboard
[5] => menu-dashboard
[6] => dashicons-dashboard
)
[4] => Array
(
[0] =>
[1] => read
[2] => separator1
[3] =>
[4] => wp-menu-separator
)
[5] => Array
(
[0] => 投稿
[1] => edit_posts
[2] => edit.php
[3] =>
[4] => open-if-no-js menu-top menu-icon-post
[5] => menu-posts
[6] => dashicons-admin-post
)
:
つづく
これを見て消したいメニュー名([0]がメニュー名)の[2]の値をremove_menu_pageの引数とすればそのメニューを削除することができます。
サブメニューを削除する
サブメニューのみを削除したい場合は remove_submenu_page 関数を指定します。
例)「投稿」メニューの「カテゴリー」「タグ」を削除する。
結論から言うと下記のコードです。
function remove_menus() {
remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=category'); // 投稿 -> カテゴリ
remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=post_tag'); // 投稿 -> タグ
}
add_action('admin_menu', 'remove_menus');
この関数は、2つの引数を持っています。これもメインメニューと同じように $submenu の値を見てみます。関数の中身については割愛します。
global $submenu;
echo "<pre>";
print_r($submenu);
echo "</pre>";
すると、下記のように表示されます。
Array
(
[index.php] => Array
(
[0] => Array
(
[0] => ホーム
[1] => read
[2] => index.php
)
[10] => Array
(
[0] => 更新 0
[1] => update_core
[2] => update-core.php
)
)
[edit.php] => Array
(
[5] => Array
(
[0] => 投稿一覧
[1] => edit_posts
[2] => edit.php
)
[10] => Array
(
[0] => 新規追加
[1] => edit_posts
[2] => post-new.php
)
[15] => Array
(
[0] => カテゴリー
[1] => manage_categories
[2] => edit-tags.php?taxonomy=category
)
[16] => Array
(
[0] => タグ
[1] => manage_categories
[2] => edit-tags.php?taxonomy=post_tag
)
)
:
つづく
ということで、第一引数は$menuの該当するメニュー配列の[2]の値で、第2引数は、第一引数で指定した引数メニュー配列の[2]の値となります。
権限条件を追加する
最後に「管理者」以外はメニューを削除するように条件を追加してみます。私の場合、引き渡し時はクライアントのアカウントを「編集者」として引き渡すことが多いのでこのようにしてます。
function remove_menus() {
if ( !current_user_can('administrator') ){
remove_menu_page('xxx');
remove_submenu_page('xxx', 'xxx');
}
}
add_action('admin_menu', 'remove_menus');
これで完了です。
-
WordPress
関連記事
-
-
申し込みページに住所等の個人情報を入力する場合は、情報流出を防ぐためSSLを導入 …
-
-
会員制のサイトや、クライアントの権限を「編集者」として引き渡しする場合など、動作 …
-
-
ソースコードを投稿し綺麗に表示したい。でもCSSをつくるのは面倒。 でいろんな言 …
-
-
クライアントに納品するようなサイトはWordPressのログイン画面のロゴをオリ …
-
-
会員専用ページをつくるにあたり、いろいろなプラグインがある。今回クライアントの要 …
-
-
イベントカレンダーのプラグイン「Events Manager」には絞り込み検索が …
-
-
WordPressのテーマを自分て作成しているとき現在表示されているのがどのテン …
-
-
便利なイベントカレンダープラグイン「Events Manager」ですが、フォー …
-
-
WordPressの記事を登録するときショートコードやタグなど手で打つのはめんど …
-
-
以前に「Events Manager」でオリジナルのプレースホルダーを追加するに …