最近 WordPress ネタばかりで、興味ない人にはすみません。今日もなんですけど、すみません。
個人的にこのところ、CMS 的に WordPress サイトを構築することが多く、またユーザには全権委譲しないで一部の機能だけ使ってもらうケースが多いわけです。
以前、「ロールをうまく設定すれば自由に権限設定できるぜえ」てな話を書いたことがありましたが、あの話では Page の編集だけするユーザを想定して書いてましたが、ただあのとき書いた方法には欠点があって、欠点があったわけですけどたとえば。
あの話では「このユーザの仕事は Page の編集がメインで、それ以上のことにはあまり首を突っ込みたく」ない、という設定だったはずで、ということは Post (投稿、いわゆるブログ) の編集もこのユーザには必要なかったはずでした。ところがあの話で定義した cms_user ロールでは、実際には Post の編集までできてしまっていた。
Post のメニューは必要ないはずだったんです。
なので、cms_user から Post 編集の権限を取っ払いたいところなんですが、ちょっと問題がある。
$role->add_cap("edit_posts"); の行を削除すればいい話なんじゃないのか? と考えそうなところですがどうもそういうわけにもいかない。
管理ページのメニューの構成とそれぞれを開くのに必要な権限を調べてみるとこんな風になっています(menu.php 参照)。
| メニュー / サブメニュー | 必要な権限 | テンプレート |
|---|---|---|
| Dashboard | read | index.php |
| Write | edit_posts | post.php |
| Write Post | edit_posts | post.php |
| Write Page | edit_pages | page-new.php |
| Manage | edit_posts | edit.php |
| Posts | edit_posts | edit.php |
| Pages | edit_pages | edit-pages.php |
| Categories | manage_categories | categories.php |
| Comments | edit_posts | edit-comments.php |
| Awaiting Moderation | edit_posts | moderation.php |
| Files | edit_files | templates.php |
| Links | manage_links | link-manager.php |
| Manage Links | manage_links | link-manager.php |
| Add Link | manage_links | link-add.php |
| Link Categories | manage_links | link-categories.php |
| Import Links | manage_links | link-import.php |
| Presentation | switch_themes | themes.php |
| Themes | switch_themes | themes.php |
| Theme Editor | edit_themes | theme-editor.php |
| Plugins | activate_plugins | plugins.php |
| Plugins | activate_plugins | plugins.php |
| Plugin Editor | edit_plugins | plugin-editor.php |
| Users | read | profile.php |
| Your Profile | read | profile.php |
| Authors & Users | edit_users | users.php |
| Options | manage_options | options-general.php |
| General | manage_options | options-general.php |
| Writing | manage_options | options-writing.php |
| Reading | manage_options | options-reading.php |
| Discussion | manage_options | options-discussion.php |
| Permalinks | manage_options | options-permalink.php |
| Miscellaneous | manage_options | options-misc.php |
| Import | import | import.php |
ここで重要なルールは、メニューを開く権限がなければ、その下のサブメニューも開けない、ということです。ということはたとえば、Page の編集メニュー(Write Page) を開くためには、edit_pages の権限だけではなく、その上の Write のメニューを開くのに必要な edit_posts の権限も合わせて必要になる、ということになります。
だから結局、edit_posts の権限を取っ払ったら Post の編集だけでなく Page の編集もできなくなるというわけです。
しばらくこれを、どうにかできないかといろいろ考えていたのですが、WordPress のコアのコードにできれば手を入れずにプラグインで実現したいところです。
要するにここで必要なことは、
- メニューを開くのに必要な権限を変更することと、
- メニューのテンプレートを変更すること
の2点ではないかと考えました。それさえクリアできればあとはロールの設定次第でどうにでもなる。
そこで、こんな一点モノのプラグインを作ってみたところ、とりあえず意図通りに動くようです。
class not_want_post {
function not_want_post() {
add_action('admin_menu', array(&$this, 'rebuild_menu'));
}
function rebuild_menu() {
global $menu, $submenu;
array_walk($menu, array(&$this, 'edit_pages_is_new_captain'));
}
function edit_pages_is_new_captain(&$item) {
if (is_array($item) && 'post.php' == $item[2]) {
$item[1] = 'edit_pages';
$item[2] = 'page-new.php';
}
}
}
new not_want_post();
Write メニューを開くのに必要な権限を edit_pages に変えて、開くテンプレートを page-new.php に変えています。これができれば、あとはユーザのロールから edit_posts の権限を取っ払えば、Post 編集のメニューを消すことができるはずです。
Manage メニューについても同じ要領で変更できると思います。
とりあえずまだアイデア段階で。この辺もうちょっと洗練させたら汎用プラグイン化できそうなんですけどね。
なんかとりとめのない話ですみません。
