WordPress 権限別に管理画面をカスタマイズする方法

WordPress 権限別に管理画面をカスタマイズする方法を紹介します。
例えば、寄稿者権限ユーザーに特定の項目だけを触らせたいときに便利な方法です。

  1. 権限別にサイドバーメニューをカスタマイズする方法
  2. 寄稿者権限の場合にサイドバーメニューをカスタマイズする方法
    1. 寄稿者権限の場合にサイドバーメニューをカスタマイズ
    2. 寄稿者権限でも画像をアップロード可能にする
    3. 他のユーザーがアップロードした画像を非表示
    4. 寄稿者権限でログイン時のみ専用のCSSを読み込む

権限別にサイドバーメニューをカスタマイズする方法

権限別にサイドバーメニューをカスタマイズする方法を紹介します。
次のコードをテーマファイル内の function.php に追加します。

/*【管理画面】権限別にサイドバーメニューの表示をカスタマイズ */
function remove_menus () {
if (current_user_can('contributor')) { // 寄稿者の場合
global $menu;
$restricted = array( // 非表示にしたいメニュー名を指定
__('固定ページ'),
__('ツール')
);
end ($menu);
while (prev($menu)){
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0]!=NULL?$value[0]:"",$restricted)){unset($menu[key($menu)]);}
}
}
}
add_action('admin_menu', 'remove_menus');

current_user_can に権限のスラッグを指定します。
指定できる権限のスラッグは以下の通りです。
• 管理者(slug : administrator)シングルサイト内のすべての管理機能にアクセスできるユーザー
• 編集者(slug : editor)他のユーザーの投稿を含むすべての投稿を発行、管理できるユーザー
• 投稿者(slug : author)自身の投稿を発行、管理できるユーザー
• 寄稿者(slug : contributor)自身の投稿を編集、管理できるが、発行はできないユーザー
• 購読者(slug : subscriber)プロファイル管理のみを実行できるユーザー

非表示にしたいメニュー名を指定するところで、左メニューの項目名をそのまま指定します。
例えば、固定ページの場合は「固定ページ」と追加します。
カスタム投稿タイプの場合も、例えばブログなどであれば「ブログ」と、左メニューのラベルを指定してください。

また、項目を複数追加する場合は次のように追加してください。

...省略...
__('xxxxx'),
__('xxxxx'),
__('xxxxx'),
__('xxxxx'),
__('xxxxx')
...省略...

最後の項目には末尾のカンマは不要です。

寄稿者権限の場合にサイドバーメニューをカスタマイズする方法

寄稿者権限は少し特殊で、デフォルトでメディアの表示がないなどの制約があります。
そのため、最初に紹介した記述と合わせて「寄稿者権限でも画像をアップロード可能にする」「他のユーザーがアップロードした画像を非表示にする」などの処理を追加します。

寄稿者権限の場合にサイドバーメニューをカスタマイズ

寄稿者権限の場合も、最初に紹介したコードをテーマファイル内の function.php に追加します。
current_user_can に指定する権限スラッグは contributor です。

/*【管理画面】寄稿者権限の場合にサイドバーメニューをカスタマイズする */
function remove_menus () {
if (current_user_can('contributor')) { //寄稿者の場合
global $menu;
$restricted = array( // 非表示にしたいメニューを指定
__('固定ページ'),
__('ツール')
);
end ($menu);
while (prev($menu)){
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0]!=NULL?$value[0]:"",$restricted)){unset($menu[key($menu)]);}
}
}
}
add_action('admin_menu', 'remove_menus');

寄稿者権限でも画像をアップロード可能にする

寄稿者権限はメディアへのアクセス権がないため、寄稿者にもメディアを使わせたい場合は、次のコードをテーマファイル内の function.php に追加します。

/*【管理画面】寄稿者権限でも画像をアップロード可能にする */
if ( current_user_can('contributor') && !current_user_can('upload_files') ){
add_action('admin_init', 'allow_contributor_uploads');
}
function allow_contributor_uploads() {
$contributor = get_role('contributor');
$contributor->add_cap('upload_files');
}

追加する位置は、最初に紹介したコードの下に続けると管理がしやすいです。

他のユーザーがアップロードした画像を非表示

寄稿者がメディアにアクセスできると、管理者がアップロードした画像が勝手に削除できてしまいます。
そういったトラブルを回避する場合は、寄稿者権限でログイン中に他のユーザーがアップロードした画像を非表示にします。
処理を追加するには、次のコードをテーマファイル内の function.php に追加します。

/*【管理画面】他のユーザーがアップロードした画像を非表示 */
function display_only_self_uploaded_medias( $query ) {
if ( $user = wp_get_current_user() ) {
$query['author'] = $user->ID;
}
return $query;
}
add_action( 'ajax_query_attachments_args', 'display_only_self_uploaded_medias' );

寄稿者権限でログイン時のみ専用のCSSを読み込む

左メニューの非表示処理で、プラグインのメニューが消せない場合があります。例えば ACF のオプションなど。
個々のプラグイン自体のカスタマイズで非表示にすることは可能ですが、全てが対応しているわけではありません。
そこで、少し強引ですが CSS を読み込み 該当箇所に display: none; を指定します。

次のコードは、寄稿者ログイン中の処理に、任意の CSS を読み込むための記述になります。

/*【管理画面】寄稿者権限の場合にサイドバーメニューをカスタマイズする */
function remove_menus () {
if (current_user_can('contributor')) { //寄稿者の場合
global $menu;
$restricted = array( // 非表示にしたいメニューを指定
__('固定ページ'),
__('ツール')
);
end ($menu);
while (prev($menu)){
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0]!=NULL?$value[0]:"",$restricted)){unset($menu[key($menu)]);}
}
function my_admin_style() {
echo '<style>li.toplevel_page_acf-options-global-navigation{display: none;}</style>'.PHP_EOL;
}
add_action('admin_print_styles', 'my_admin_style');
}
}
add_action('admin_menu', 'remove_menus');

該当箇所だけ取り出すと次のコードになります。

...省略...
function my_admin_style() {
echo '<style>li.plugin_name {display: none;}</style>'.PHP_EOL;
}
add_action('admin_print_styles', 'my_admin_style');
...省略...

左メニュー内のpluginの項目に、固有のクラス名が付与されていればそのクラス名を指定します。
例では、インラインで記述していますが、書き方を変えて外部ファイルに変更することも可能です。
しかし、メニューをCSSで非表示にした場合、URLに直接アクセスされると、管理ページが表示されてしまうため注意が必要です。

まとめ

WordPress 権限別に管理画面をカスタマイズする方法を紹介しました。