WordPressのユーザー権限をカスタマイズするときに必要な権限の知識

WordPressは、どのユーザーアカウントにどの権限を与えるかを権限グループという概念で定めています。開発者はこの権限を細かにカスタマイズできます。この記事では権限のカスタマイズで必要な最低限の知識をまとめてお送りします。

基礎知識については「ユーザーの種類と権限 / Roles and Capabilities」を参照してください。

WordPressの権限の種類

デフォルトで用意されている権限グループは次の6種類です。特権管理者と購読者はあまり使わないかもしれません。編集者、投稿者、寄稿者は違いがややこしいですが、誰の記事を編集・公開できるかの視点で見るとわかりやすいです。

  • 特権管理者
    • マルチサイト運用する方に必要な権限グループ。単体のWordPressでは考慮不要です
  • 管理者
    • すべての管理機能にアクセスできる権限グループ。ユーザー管理、プラグイン管理、サイト設定ができます
  • 編集者
    • 他人の記事を編集・公開できます
  • 投稿者
    • 自身の記事を編集・公開できます
  • 寄稿者
    • 自身の記事を編集できるが公開はできない
  • 購読者
    • プロファイル管理のみを実行できるユーザー

これら以外の独自の権限グループは add_role() 関数や remove_role() 関数を使って作成または削除ができます。

付与可能な権限の種類

全部で73個もの権限があります。あまりにも数が多いので、この記事ではお仕事でカスタマイズ要望の多いユーザーとプラグインに関する権限を、例を交えてみていきたいと思います。

全リストはドキュメント(権限・権限グループテーブル)をご覧ください。

ユーザー管理に関する権限

例:編集者にユーザー管理権限を付与したい

デフォルトの編集者にはユーザー管理権限がありません。管理者以上のユーザーのみがユーザーの追加・削除・変更・編集を行えます。編集者もユーザー管理をしたい場合、ユーザーに関する権限を編集者に付与すれば良いです。

ユーザーに関する権限は6つあります。

  • list_users
    • ユーザーアカウントの一覧を表示できるかどうか
  • create_users
  • delete_users
  • promote_users
    • 権限の変更ができるかどうか。投稿者を編集者に変えるなどです
  • edit_users
    • 他人のプロフィール内容を編集できる権限
  • remove_users
    • deleteとの違いとして、こちらはマルチサイト用の削除

プラグインに関する権限

例:編集者にプラグイン権限を付与したい

デフォルトの編集者にはプラグインに関する権限がありません。管理者以上のユーザーのみがプラグインの追加・有効化・更新・削除・編集を行えます。編集者もプラグイン管理をしたい場合、プラグインに関する権限を編集者に付与すれば良いです。

  • install_plugins
    • プラグインのインストールができるようになります。この権限を単体で付与した場合にダッシュボード>更新がアクセスできるようになることを確認しました。update権限ではないので変な感じがします……
  • activate_plugins
  • update_plugins
  • delete_plugins
  • edit_plugins
    • これはプラグインエディターという画面を指しています。プラグインのコードを管理画面から編集できる画面です
  • resume_plugins
    • これはよくわかりませんでした

手動で付与する

さて、権限の種類を見てきたところで、実際に権限を付与してみましょう。 functions.php に以下のコードを書くとお試しができます。画面をリロードするとデータベースに書き込まれます。

// 編集者(editor)にユーザー関連の管理権限を付与
add_action('admin_init', function() {
  $role = get_role( 'editor' );

  $role->add_cap( 'list_users' ); 
  $role->add_cap( 'create_users' ); 
  $role->add_cap( 'delete_users' ); 
  $role->add_cap( 'promote_users' ); 
  $role->add_cap( 'edit_users' ); 
  $role->add_cap( 'remove_users' ); 
});

一度書き込まれたらコードを消しても元には戻りませんので、元に戻したいときは remove_cap() を書いてから画面を読み込んでください。

$role->remove_cap( 'list_users' );

こうして権限は付与できるものの、冒頭でも少し触れたように、残念ながらこれだけではナイーブすぎる挙動となるため使い勝手が悪いです。

例えばこのようなことが起こります:

  • 編集者にユーザー削除権限を与えると、より上位の権限のユーザーである管理者を削除できてしまう

より上位の権限のユーザーへの操作はできないようになっていてほしいところですが、できてしまうようでした。できればプラグインを使用せずにこれを解決したいところですが、権限によって表示・非表示する処理は複雑になるので、よほどのことがない限りは素直にプラグインに頼るのが良いと思いました。

おすすめのプラグイン「User Role Editor」

User Role Editorは上述の問題をちゃんとケアしています。実際に動作させてみて確認しました。編集者は管理者を一覧することも追加や削除の操作も行えません。あくまで自身と同じ権限グループかより弱い権限グループに対する操作に限定されます。

よくできているなと思ったところは、編集者にプラグイン編集権限を付与したとしても、User Role Editor自身は編集者にみえないというところです。これが見えてしまったら意味がないですからね(笑)