WordPressで指定ユーザーのみ管理画面の機能を制限する方法

テクノロジー

WordPressでホームページを作成した後、引き続き管理を行う必要があります。機能追加や脆弱性の対応でWordPress自体の更新やプラグインの更新があるからです。

このような更新等の保守を行うと同時に、クライアント側では記事の投稿等が必要となります。場合によっては権限レベルを管理者にしなければいけません。しかし、管理者権限を与えてしまうと、投稿以外で必要ない項目や機能が表示されてしまいます。万が一間違えて他の機能を使ってしまいホームページ自体がおかしくなってしまうと一大事ですし、クライアントも混乱してしまいます。

これを防ぐには機能を制限するしか無いです。権限を「管理者」ではなく、「投稿者」にすれば一部の機能が制限されますが、これでも不十分だったりします。また、例外として管理者と同等の権限を与えないとクライアントに使用して欲しい一部のプラグインが機能しません。

そこで、今回は権限レベルを弄るのではなく、指定のユーザーに使用できる機能を制限する方法をご紹介します。
以前、記事で紹介した「WordPressのfunction.phpを修正・追加して使いやすくしよう!」の機能が御座いますのであしからず。

各ユーザーのIDを知る

ユーザーごとに機能と制限するには、まずユーザーのIDを知る必要があります。ユーザーIDはユーザー一覧で表示されていません。確認するには、ユーザーIDを確認したいユーザー名にマウスを乗せます。左下に「サイトURL/wp-admin/User-edit.php?user_id=1」とリンクが表示されます。そこの「user_id=1」の「1」がユーザーIDとなります。

ユーザーID

今回は管理者権限が3人にて、1人が製作者、2人がクライアントとします。各ユーザーIDは以下の通りです。

ユーザー名 権限 ユーザーID
製作者 管理者 1
クライアントA 管理者 2
クライアントB1 管理者 3

指定ユーザーのみ処理をさせる条件式

指定ユーザーに処理を反映させる方法は以下の通りです。

global $current_user;
get_currentuserinfo();
if ($current_user->ID != "1" ) {
 //ここに処理を書く
}

今回は、製作者(ID:1)以外に適用させるので「$current_user->ID != “1”」を使いました。
これにより「ユーザーIDが1じゃなかった場合、処理をしなさい」という事になります。

if分の中に適用させたい処理を書いていきましょう。

メニューの一部を非表示にする

管理画面のメニューはクライアントに必要のない項目が多いです。そのままにして置くのも可能ですが、万が一間違えて触ってしまったら大変なことになります。そうなる前に不要なメニューは非表示にしちゃいましょう。

function remove_menus () {
	global $menu;
	global $current_user;
	get_currentuserinfo();
	if($current_user -> ID != "1") {
		$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)]);
			}
		}
	remove_submenu_page('index.php','update-core.php'); //更新非表示
	remove_submenu_page('edit.php','edit-tags.php?taxonomy=post_tag'); //タグ非表示
	remove_submenu_page('edit.php','edit-tags.php?taxonomy=category'); //カテゴリー非表示
	remove_menu_page('siteguard'); //SiteGuardプラグイン非表示
	}
}
add_action('admin_menu', 'remove_menus');

一部のメニューは「$restricted = array」で指定しても非表示になりません。
その場合は「remove_menu_page」「remove_submenu_page」で非表示にしましょう。

メニューの名前を変更する

管理画面のメニューの名前は初めて触るクライアントにとって混乱を招く要素となります。
もっとわかりやすくシンプルな名前にしましょう。

global $current_user;
get_currentuserinfo();
if ($current_user->ID != "1" ) {
	add_filter(  'gettext',  'change_side_text'  );
	add_filter(  'ngettext',  'change_side_text'  );
	function change_side_text( $translated ) {
     	$translated = str_ireplace(  'ダッシュボード',  '管理画面TOP',  $translated );
     	$translated = str_ireplace(  'ニュース',  'お知らせを書く',  $translated );
    	$translated = str_ireplace(  '投稿',  'ブログを書く',  $translated );
     	$translated = str_ireplace(  'メディア',  '画像の管理',  $translated );
     	return $translated;
}

上部の管理バーの項目を非表示にする

global $current_user;
get_currentuserinfo();
if ($current_user->ID != "1" ) {
	function mytheme_remove_item( $wp_admin_bar ) {
		$wp_admin_bar->remove_node('updates'); // アップデート通知
		$wp_admin_bar->remove_node('wp-logo'); // WordPressロゴ
		$wp_admin_bar->remove_node('comments'); // コメント
		$wp_admin_bar->remove_node('new-content'); // 新規投稿ボタン
		$wp_admin_bar->remove_menu('my-account'); // マイアカウント
	}
	add_action( 'admin_bar_menu', 'mytheme_remove_item', 1000 );
}

表示オプションとヘルプを非表示にする

表示させる項目を選択するための「表示オプション」があるのですが、クライアント側で表示させたい項目を変更出来てしまいます。出来る限りシンプルにさせたいので、この機能も非表示にしましょう。またクライアントにとって意味を成さない「ヘルプ」も非表示にしましょう。

global $current_user;
get_currentuserinfo();
if ($current_user->ID != "1" ) {
	function my_admin_head(){
		echo '<style type="text/css">#contextual-help-link-wrap,#screen-options-link-wrap{display:none;}</style>';
	}
	add_action('admin_head', 'my_admin_head');
}

ここではCSSを利用しています。
表示オプションに指定されている「#screen-options-link-wrap」「#contextual-help-link-wrap」を「Display:none」で非表示にすることが出来ます。

ダッシュボードに製作者からのお知らせを載せる

製作者からクライアントへお知らせを載せたい場合、以下の方法で載せることが出来ます。マニュアルのダウンロードや更新情報などを載せるのに大変便利です。

global $current_user;
get_currentuserinfo();
if ($current_user->ID != "1" ) {
	add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');
	function my_custom_dashboard_widgets() {
		global $wp_meta_boxes;
		wp_add_dashboard_widget('custom_help_widget', 'HYZstudioからのお知らせ', 'dashboard_text');
	}
	function dashboard_text() {
		echo '<p>ここに文章を書く</p>';
	}
}

いかがだったでしょうか?
クライアントへ渡す際には是非行っておきたい設定です。

後で問題が発生するよりも先に問題の発生源を無くす事が大事です。クライアントが安心して簡単に使えるよう心がけるのが製作者です。クライアントを不安にさせない、問題を発生させないようにしていきましょう!