WordPress特集 - ユーザー権限のカスタマイズ
公開日:2021年11月25日
ユーザー権限は5つのグループ(マルチサイトは6つ)に分かれており、新規で追加されたユーザーはいずれかのグループに属します。この記事では、それぞれのグループが持っている権限をカスタマイズする方法を解説します。
【記事執筆時の環境】
WordPress 5.8
【参考ページ】
サポート - ユーザーの種類と権限
WordPressユーザーの「権限グループ」と「権限」徹底解説ガイド
それぞれの権限グループに割り当てられた権限
それぞれの権限グループには、特定のタスク実行を許可する権限が割り当てられています。詳細は参考ページ「サポート - ユーザーの種類と権限」をご覧ください。
マルチサイトにおける特権管理者(Super Admin)は、すべての権限を持っています。
管理者(Administrator)の権限は、WordPress をシングルサイトでインストールしたかマルチサイトでインストールしたかで、かなり違います。
シングルサイトでは管理者が最上位の権限グループですので、WordPress コアやプラグインのアップデートもできますし、テーマの編集もできます。つまり、マルチサイトの特権管理者に相当します。
マルチサイトにおける管理者は、そのような他のサイトに影響を与える権限は持っていません。
編集者(Editor)は、コンテンツ編集に関する権限が付与されています。シングルサイトとマルチサイトでの違いは、「unfiltered_html」があるかどうかです。unfiltered_html は許可されていない HTML タグを追加できる権限ですが、編集者はシングルサイトではこの権限を持っていますが、マルチサイトでは持っていません。これはセキュリティ上の観点からそうしているとアナウンスされています。
その他、投稿者(Author)、寄稿者(Contributor)、購読者(Subscriber)とだんだん許可されている権限が少なくなっていきます。
サイトを構築する際、どのような権限を持ったユーザーを作成するかを検討します。よくあるケースは、サイトの制作に責任を持つ業者が管理者権限を持ち、クライアントは編集者権限にするというものです。
大掛かりなサイトでない限り、ユーザーを構成するグループは3つまでが現実的です。それ以上だとかえって管理が煩雑になるだけです。サイト管理者用、コンテンツ担当者用、そして会員制サイトの場合はログインユーザー用の3つが考えられます。
新しい権限グループを作成する
WordPress 標準の権限グループはそのままにしておいて、新しく権限グループを作成しユーザーに割り当てることができます。
新しい権限グループを作成するには、関数 add_role() を使います。権限グループはデータベースに追加されますので、add_role() は一度だけ実行すれば十分です。したがって実行タイミングはテーマ有効時などにします。
なお、既存の権限グループを削除する関数としては remove_role() があります。remove_role() が実行されると、そのグループはデータベースから削除され復活することはありません。したがって権限グループが削除されたあとは、remove_role() のコードは取り除いても構いません。
add_role() を使って権限グループを新規作成するには、パラメーターで与える権限を列挙するので結構面倒です。
プラグインを利用するほうが楽で、便利なプラグインに「User Role Editor」があります。
権限をカスタマイズする
管理者以外の権限グループをユーザーに割り当てたとしても、持っている権限を増やしたり減らしたりするカスタマイズを行いたいことは、しょっちゅう起こり得ます。
前に紹介したプラグイン「User Role Editor」を使うとそれも簡単にできますが、たった1つの権限を増やしたいだけなら何もプラグインに頼る必要はありません。以下、いくつかのカスタマイズ例を紹介します。
投稿者にHTMLフィルターを解除する権限を付与する
投稿者は本文に追加できない HTML タグがあります。script タグや iframe タグは投稿者が追加しても保存時に WordPress が消してしまいます。unfiltered_html を権限として持たせることで、これを回避できます。
1 2 3 4 5 |
function my_add_cap_to_author() { $role = get_role('author'); $role->add_cap('unfiltered_html'); } add_action('after_switch_theme', 'my_add_cap_to_author'); |
なお、編集者はシングルサイトでは unfiltered_html を持っていますが、マルチサイトでは持っていません。そして上記コードを使ってもマルチサイトでは unfiltered_html を有効にすることはできませんので注意してください。
編集者にテーマオプション編集権限を付与する
編集者はコンテンツの作成・管理が担当ですが、ウィジェットやメニューの編集をまかせたいこともあります。ウィジェットやメニューはテーマオプション編集権限がないと編集できません。そこで、edit_theme_options を付与します。
下記コードを functions.php に記述します。コードの実行は一度でいいので、アクションフック after_switch_theme に追加しています。
1 2 3 4 5 |
function my_add_cap_to_editor() { $role = get_role('editor'); $role->add_cap('edit_theme_options'); } add_action('after_switch_theme', 'my_add_cap_to_editor'); |
カスタマイザーに独自項目を追加する
上記の例で、編集者にテーマオプション編集権限を付与し、ウィジェットやメニューの編集はできるようになりました。これに加え、サイトのキャッチフレーズの編集も許可したい場合はどうすればよいでしょう? キャッチフレーズはヘッダーに表示されるテーマも多くあります。
テーマオプション編集権限でカスタマイザーにアクセスできるようになりますが、カスタマイザーメニューとしてキャッチフレーズが編集可能な「サイト基本情報」はありません。管理者はカスタマイザーにサイト基本情報が表示されますし、メインの管理メニューから [設定]>[一般設定] でキャッチフレーズを編集できます。
サイト基本情報は、manage_options 権限を持っていないと編集できないようになっています。しかしこの権限を与えてしまうと、パーマリンク設定などもできてしまいますので、編集者ユーザーには付与したくありません。そこで、カスタマイザーにキャッチフレーズが編集できる独自項目を追加することで対応します。
下記コードを記述します。テーマオプション編集権限を持っている場合は、キャッチフレーズを編集できるメニューがカスタマイザーに表示されます。
1 2 3 4 5 6 |
function my_customize_register($wp_customize) { $wp_customize->get_setting('blogdescription')->capability = 'edit_theme_options'; $wp_customize->get_control('blogdescription')->label = 'キャッチフレーズ'; $wp_customize->get_control('blogdescription')->description = 'キャッチフレーズはロゴの下に表示されます。'; } add_action('customize_register', 'my_customize_register'); |
マルチサイトの編集者で unfiltered_html を有効化する
HTML フィルターを解除する権限 unfiltered_html は、マルチサイトでは add_cap() で付与しても有効になりません。そこで、マルチサイトの編集者ユーザーで unfiltered_html を有効化したい場合は下記コードを記述します。フィルターフック map_meta_cap を使っています。
1 2 3 4 5 6 7 |
function my_add_cap_to_editor($caps, $cap, $user_id) { if ($cap === 'unfiltered_html' && user_can($user_id, 'editor')) { $caps = array('unfiltered_html'); } return $caps; } add_filter('map_meta_cap', 'my_add_cap_to_editor', 1, 3); |
管理者以外がコンテンツ編集時に特定のHTMLタグが消えるのを回避する
管理者以外では、unfiltered_html 権限が有効になっていないため、コンテンツ編集時に特定の HTML タグが消えてしまいます。
グローバル変数 $allowedposttags に HTML タグを個別に指定することで、追加できるようにすることが可能です。
下記コードは例ですが、Google マップなどに必要な iframe タグと SVG画像を表示するのに必要な svg/path タグを扱えるようにしています。グローバル変数 $allowedposttags にはタグ名と使用する属性をセットします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function my_save_pre($content) { global $allowedposttags; // iframeと属性を指定 $allowedposttags['iframe'] = array( 'class' => true, 'src' => true, 'width' => true, 'height' => true, 'frameborder' => true, ); // svgと属性を指定 $allowedposttags['svg'] = array( 'xmlns' => true, 'viewbox' => true, ); $allowedposttags['path'] = array( 'd' => true, ); return $content; } add_filter('content_save_pre', 'my_save_pre'); |
«次の特集記事»
«前の特集記事» お問い合わせフォームの設置方法
スポンサーリンク