質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1033閲覧

WordPressのマルチサイトで特権管理者でない管理者にcreate_usersなどを付与したいができない

threeaster

総合スコア14

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/02/19 08:39

前提・実現したいこと

WordPressの特権管理者でない管理者にもユーザーの管理をさせたいので、create_usersedit_usersなどの権限を付与したいです。

発生している問題・エラーメッセージ

get_role('administrator')->add_cap('create_users')を行っているのにもかかわらず、ユーザー一覧の上の方では「既存のユーザーを追加」しか表示されず、また、作成ページでも「既存のユーザーを追加」しかできません。新規のユーザーを追加することができません。
edit_usersdelete_usersでも同様にリンクが表示されません。

該当のソースコード

php

1 if(current_user_can('administrator') && !(current_user_can('create_users') && current_user_can('edit_users') && current_user_can('delete_users'))){ 2 $current_user = get_role('administrator'); 3 $current_user->add_cap('create_users'); 4 $current_user->add_cap('edit_users'); 5 $current_user->add_cap('delete_users'); 6 }

これをfunctions.phpに記入しています。

試したこと

上を簡略化して

php

1add_action('init', function() { 2 get_role('administrator')->add_cap('create_users'); 3});

としても同様でした。また、

php

1add_action('init', function() { 2 get_role('administrator')->add_cap('create_users'); 3 var_dump(current_user_can('create_users')); 4});

として、特権管理者でない管理者でアクセスするとbool(false)と表示されたので、create_usersが間違っているみたいなことはないと思います。

デフォルトのWordPressをマルチサイト化しただけのところでやっても同様でした。

補足情報(FW/ツールのバージョンなど)

MAMP 5.2(351)
PHP7.2.10
MySQL5.7.23
Apache2.2.34
macOS Mojave 10.14.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

回答がつかないようなので...

ちょっと中身は見ていないのですが、「User Role Editor」プラグインに「特権管理者以外がユーザーの作成・編集・削除することを許可」という設定項目があるので、このプラグインを利用することで、各サイトの管理者に新規ユーザーを作成する権限を与えることが可能です。

User Role Editor

どのような処理をしているのかプラグインのソースコードを確認してみるのが早いかもしれません。

設定画面
イメージ説明

投稿2019/02/26 06:56

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

threeaster

2019/02/27 12:33

User Role Editorのソースを見ることで解決できました。ありがとうございます。
guest

0

自己解決

User Role Editorの中身を見ることで、どうやればいいかがわかりました。
結論から言えば、以下をfunctions.phpに追加することでできました。
(これだと管理者が特権管理者の情報を編集できてしまうので、それを防ぐ記述が必要になるかもしれません)

php

1add_filter('map_meta_cap', function($caps, $cap){ 2 foreach ($caps as $key => $capability) { 3 if ($capability != 'do_not_allow'){ 4 continue; 5 } 6 7 switch ($cap) { 8 case 'edit_user': 9 case 'edit_users': 10 $caps[$key] = 'edit_users'; 11 break; 12 case 'delete_user': 13 case 'delete_users': 14 $caps[$key] = 'delete_users'; 15 break; 16 case 'create_users': 17 $caps[$key] = $cap; 18 break; 19 } 20 } 21 return $caps; 22}, 1, 2); 23 24add_action('admin_init', function(){ 25 remove_all_filters('enable_edit_any_user_configuration'); 26 add_filter('enable_edit_any_user_configuration', '__return_true'); 27});

まず、map_meta_capですが、これはメタ権限などを考慮して権限を最終的に決定するフィルタです。
例えば$capcreate_usersのときに['create_users'] を返せばcreate_users権限を持っている人がユーザー作成できるし、
['edit_posts']を返せばedit_posts権限を持っている(つまり投稿を編集できる)人がユーザーを作成できるようになります。
ここで、WordPressコアでは以下のように記述されています。

php

1// wp-includes/capabilities.php 2 3function map_meta_cap( $cap, $user_id ) { 4 $args = array_slice( func_get_args(), 2 ); 5 $caps = array(); 6 7 switch ( $cap ) { 8 // ... 9 case 'create_users': 10 if ( !is_multisite() ) 11 $caps[] = $cap; 12 elseif ( is_super_admin( $user_id ) || get_site_option( 'add_new_users' ) ) 13 $caps[] = $cap; 14 else 15 $caps[] = 'do_not_allow'; 16 break; 17 // ... 18 } 19 return apply_filters( 'map_meta_cap', $caps, $cap, $user_id, $args ); 20}

つまり、マルチサイトでは特権管理者でない限り、add_capで権限を付与しても最終的に権限が付与されません。
なので、改めてマルチサイト関係なく$capcreate_usersなら['create_users']を返すなどのフィルタをmap_meta_capフックに登録する必要があり、これで特権管理者でない管理者にもユーザーを作ることができるようになりました。

しかし、このとき、自分以外のユーザーの編集のリンクは出ていますが、編集ページに行くと「このユーザーを編集する権限がありません。」とでて編集できません。

なので、enable_edit_any_user_configurationフックに__return_true(=function(){ return true; })をセットする必要があります。
enable_edit_any_user_configurationはマルチサイトで管理者がユーザーを編集できるかを制御していています。
WordPressコアでは以下のようになっています。

php

1if ( ! defined('EDIT_ANY_USER') || ! EDIT_ANY_USER ) // back compat constant. 2 add_filter( 'enable_edit_any_user_configuration', '__return_false' );

このままだとfalseが返ってきて管理者がユーザー編集ができないため、これを削除してtrueが返ってくるようにしました。
なお、EDIT_ANY_USERを定義しても同じことができるようですが、enable_edit_any_user_configuration自体がEDIT_ANY_USER定数を削除するために導入されたようなので、enable_edit_any_user_configurationを使うのが正攻法のようです。

投稿2019/02/27 12:31

threeaster

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問