要らないメニューを省きたい

最近 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 メニューについても同じ要領で変更できると思います。

とりあえずまだアイデア段階で。この辺もうちょっと洗練させたら汎用プラグイン化できそうなんですけどね。

なんかとりとめのない話ですみません。