ここはちょっと見せられない

ぜったいぜったい見せられない

has_cap で使う権限名と数値で表す Level の記述方法について

has_cap 云々の古いプラグインではよくエラーがでている権限の話。
警告されるのもうざい。
しょうがないから各関数で $capability として与える権限名がわからないので調べてみた。

そもそも数値で与えると一応処理は通してはくれるけど、Notice が出て、「もう使わないようにしてね」って言われていた。*1

追記*2

権限は細かく区切られていて、どれを選ぶのかよくわからないよね。

参考:
http://codex.wordpress.org/Roles_and_Capabilities

各権限に相当するlevelは下記の通り。

Administrator / Level_10
Editor / Level 7
Author / Level_2
Contributor / Level_1
Subscriber / Level_0

3〜6の間がごっそり抜けている。なんでだろう。

「level_」記述 は多分旧バージョンの名残なのだろうと想像。
いつまで使えるのかなあ。


実際には wp_option の中に wp_user_roles という名前のオプションがあり、
その中に権限情報が集約されている。
本当は wp_user_roles というテーブルを作りたかったように見える。
(wp-includes/capabilities.php参照)
とりあえず初期状態のデータの中をメモっておくことにする。
Wordpress3.4.1にて。

a:5:{
	s:13:"administrator";
	a:2:{
		s:4:"name";
		s:13:"Administrator";
		s:12:"capabilities";
		a:62:{
			s:13:"switch_themes";
			b:1;
			s:11:"edit_themes";
			b:1;
			s:16:"activate_plugins";
			b:1;
			s:12:"edit_plugins";
			b:1;
			s:10:"edit_users";
			b:1;
			s:10:"edit_files";
			b:1;
			s:14:"manage_options";
			b:1;
			s:17:"moderate_comments";
			b:1;
			s:17:"manage_categories";
			b:1;
			s:12:"manage_links";
			b:1;
			s:12:"upload_files";
			b:1;
			s:6:"import";
			b:1;
			s:15:"unfiltered_html";
			b:1;
			s:10:"edit_posts";
			b:1;
			s:17:"edit_others_posts";
			b:1;
			s:20:"edit_published_posts";
			b:1;
			s:13:"publish_posts";
			b:1;
			s:10:"edit_pages";
			b:1;
			s:4:"read";
			b:1;
			s:8:"level_10";
			b:1;
			s:7:"level_9";
			b:1;
			s:7:"level_8";
			b:1;
			s:7:"level_7";
			b:1;
			s:7:"level_6";
			b:1;
			s:7:"level_5";
			b:1;
			s:7:"level_4";
			b:1;
			s:7:"level_3";
			b:1;
			s:7:"level_2";
			b:1;
			s:7:"level_1";
			b:1;
			s:7:"level_0";
			b:1;
			s:17:"edit_others_pages";
			b:1;
			s:20:"edit_published_pages";
			b:1;
			s:13:"publish_pages";
			b:1;
			s:12:"delete_pages";
			b:1;
			s:19:"delete_others_pages";
			b:1;
			s:22:"delete_published_pages";
			b:1;
			s:12:"delete_posts";
			b:1;
			s:19:"delete_others_posts";
			b:1;
			s:22:"delete_published_posts";
			b:1;
			s:20:"delete_private_posts";
			b:1;
			s:18:"edit_private_posts";
			b:1;
			s:18:"read_private_posts";
			b:1;
			s:20:"delete_private_pages";
			b:1;
			s:18:"edit_private_pages";
			b:1;
			s:18:"read_private_pages";
			b:1;
			s:12:"delete_users";
			b:1;
			s:12:"create_users";
			b:1;
			s:17:"unfiltered_upload";
			b:1;
			s:14:"edit_dashboard";
			b:1;
			s:14:"update_plugins";
			b:1;
			s:14:"delete_plugins";
			b:1;
			s:15:"install_plugins";
			b:1;
			s:13:"update_themes";
			b:1;
			s:14:"install_themes";
			b:1;
			s:11:"update_core";
			b:1;
			s:10:"list_users";
			b:1;
			s:12:"remove_users";
			b:1;
			s:9:"add_users";
			b:1;
			s:13:"promote_users";
			b:1;
			s:18:"edit_theme_options";
			b:1;
			s:13:"delete_themes";
			b:1;
			s:6:"export";
			b:1;
		}
	}
	s:6:"editor";
	a:2:{
		s:4:"name";
		s:6:"Editor";
		s:12:"capabilities";
		a:34:{
			s:17:"moderate_comments";
			b:1;
			s:17:"manage_categories";
			b:1;
			s:12:"manage_links";
			b:1;
			s:12:"upload_files";
			b:1;
			s:15:"unfiltered_html";
			b:1;
			s:10:"edit_posts";
			b:1;
			s:17:"edit_others_posts";
			b:1;
			s:20:"edit_published_posts";
			b:1;
			s:13:"publish_posts";
			b:1;
			s:10:"edit_pages";
			b:1;
			s:4:"read";
			b:1;
			s:7:"level_7";
			b:1;
			s:7:"level_6";
			b:1;
			s:7:"level_5";
			b:1;
			s:7:"level_4";
			b:1;
			s:7:"level_3";
			b:1;
			s:7:"level_2";
			b:1;
			s:7:"level_1";
			b:1;
			s:7:"level_0";
			b:1;
			s:17:"edit_others_pages";
			b:1;
			s:20:"edit_published_pages";
			b:1;
			s:13:"publish_pages";
			b:1;
			s:12:"delete_pages";
			b:1;
			s:19:"delete_others_pages";
			b:1;
			s:22:"delete_published_pages";
			b:1;
			s:12:"delete_posts";
			b:1;
			s:19:"delete_others_posts";
			b:1;
			s:22:"delete_published_posts";
			b:1;
			s:20:"delete_private_posts";
			b:1;
			s:18:"edit_private_posts";
			b:1;
			s:18:"read_private_posts";
			b:1;
			s:20:"delete_private_pages";
			b:1;
			s:18:"edit_private_pages";
			b:1;
			s:18:"read_private_pages";
			b:1;
		}
	}
	s:6:"author";
	a:2:{
		s:4:"name";
		s:6:"Author";
		s:12:"capabilities";
		a:10:{
			s:12:"upload_files";
			b:1;
			s:10:"edit_posts";
			b:1;
			s:20:"edit_published_posts";
			b:1;
			s:13:"publish_posts";
			b:1;
			s:4:"read";
			b:1;
			s:7:"level_2";
			b:1;
			s:7:"level_1";
			b:1;
			s:7:"level_0";
			b:1;
			s:12:"delete_posts";
			b:1;
			s:22:"delete_published_posts";
			b:1;
		}
	}
s:11:"contributor";
a:2:{
	s:4:"name";
	s:11:"Contributor";
	s:12:"capabilities";
		a:5:{
			s:10:"edit_posts";
			b:1;
			s:4:"read";
			b:1;
			s:7:"level_1";
			b:1;
			s:7:"level_0";
			b:1;
			s:12:"delete_posts";
			b:1;
		}
	}
s:10:"subscriber";
	a:2:{
		s:4:"name";
		s:10:"Subscriber";
		s:12:"capabilities";
		a:2:{
			s:4:"read";
			b:1;
			s:7:"level_0";
			b:1;
		}
	}
}

*1:過去形なのは、最新ではどうも元に戻った様子だから。数字で与えるとコア内部で「Level_」をつけてくれるようになっていた。この警告、よほど不評だったのかしらん。今更だから続行。

*2:ソース見たらもともとコア内部はlevelをつけてくれてて、ちゃんと警告出すようになっていた。はて。なんで出なくなってんだ。is_numeric true で出してくれるはずだけど。。。これ以上見んのも嫌だわあ