web-dev-qa-db-ja.com

サイト管理者がWordPressネットワーク/マルチサイト設定でユーザーを編集できるようにするにはどうすればいいですか?

ネットワーク内にいくつかのサイトがあります。私はサイト管理者にネットワークプラグインのようなものを管理させたくはありませんが、彼らが彼らのサイトでそれらを使用するのではなく、すべてのネットワークユーザーのプロファイルを編集できるようにしたいです。

/wp-admin/network/users.phpファイルの先頭には、次のとおりです。

 if(!current_user_can( 'manage_network_users'))
 wp_die(__( 'あなたはこのページにアクセスする権限がありません。')); 

スーパー管理者に昇格させずにサイト管理者にmanage_network_usersへの特権を付与するにはどうすればよいですか?

コードは次のようになります。

 
/** 
 *スーパー管理者のリストを取得します。
 * 
 * @ since 3.0.0 
 * [設定されていれば、スーパー管理者グローバル変数
 * 
 * @return配列スーパー管理者ログインのリスト
 */
関数get_super_admins(){
 global $ super_admins; 
 
 if(isset($ super_admins))
 return $ super_admins; 
 else 
 ] get_site_option( 'site_admins'、array( 'admin')); 
} 
を返します。
 
/** 
 *ユーザーがサイト管理者であるかどうかを確認します。
 * 
 * @ since 3.0.0 
 * 
 * @param int $ user_id(オプション)ユーザーのID。デフォルトは現在のユーザです。
 * @return boolユーザがサイト管理者であれば真になります。
 */
関数is_super_admin($ user_id = false){
 if($ user_id)
 $ user = new WP_User($ user_id); 
 else 
 $ user = wp_get_current_user(); 
 
 if( empty($ user-> id))
 falseを返す; 
 
 if(is_multisite()){
 $ super_admins = get_super_admins(); 
 if(is_array($ super_admins)&& in_array($ user-> user_login、$ super_admins))
 trueを返す; 
} else {
 if($ user-> has_cap() 'delete_users'))
はtrueを返し、
} 
 
はfalseを返します; 
} 
 
 /** 
 *ユーザーに機能またはロール名があるかどうか
 * 
 *ユーザーが特定のロールを持っているかどうかを調べるのに便利です。 。] *ユーザーに割り当てられています。 2番目のオプションのパラメータは
 *特定の投稿に対する機能をチェックするためにも使用できます。
 * 
 * @since 2.0.0 
 * @access public [ * 
 * @param string | int $ cap検索する機能またはロール名。
 * @param int $ post_idオプション。特定の投稿に対する機能をチェックするための投稿ID。
 * @return boolユーザーに機能がある場合はtrue。ユーザーが機能を持っていない場合はfalse。
 */
関数has_cap($ cap){
#fb($ cap); 
 if(is_numeric($) cap)){
 _deprecated_argument(__FUNCTION__、 '2.0'、__( 'プラグインとテーマによるユーザレベルの使用は推奨されていません。代わりにロールとケーパビリティを使用してください。)); 
 $ cap = $ this-> translate_level_to_cap($ cap); 
} 
 
 $ args = array_slice(func_get_args()、1); 
 $ args = array_merge(array($) cap、$ this-> ID)、$ args); 
 $ caps = call_user_func_array( 'map_meta_cap'、$ args); 
 
 //マルチサイトのスーパー管理者は定義、特に断らない限り、
 if(is_multisite()&& is_super_admin($ this-> ID)){
 if(in_array( 'do_not_allow'、$ caps))
 return false; 
 trueを返す; 
} 
 
 //すべての要求された上限を持っている必要があります
 $ capabilities = apply_filters( 'user_has_cap'、$ this-> allcaps、$ caps、$ args); 
 $ capabilities ['exist'] = true; //全員が存在を許可されます
 foreach((array)$ capsを$ capとして){
 // echo "cap $ capの確認
"; if(empty($ capabilities [$ cap])||!$ capabilities [$ cap]) falseを返します; } [.____真を返す; }

ネットワークユーザーを編集するための2番目の機能チェックを示す、wp-adminのusers.phpからのコード:

 //マルチサイトのスーパー管理者だけがすべてのユーザーを編集できるようにします。 'enable_edit_any_user_configuration'、true))
 wp_die(__( 'このユーザーを編集する権限がありません。')); 
 
2
cwd

これは私のために働いた解決策です:

http://thereforei.am/2011/03/15/how-to-allow-administrators-to-edit-users-in-a-wordpress-network/ /

かなりエレガントで、コアをいじる必要はありません。

6
Michael

残念ながら、コメントを追加したり投票したりするには十分なポイントがありませんが、 @Michael の答えを他の投稿に指摘しておきたいと思います。管理者/スーパー管理者アカウントの編集.

Michaelによって与えられたpost linkの中の解決策はうまくいきます 、私はそれをWP multi-site v4.1に適用しました。ただし、管理者以外のユーザーが管理者アカウントを編集しようとすると、die()関数が呼び出されます。そのため、代わりに このソリューション (最初はWPの単一サイトインストール用です)を使用しました。これは、管理者以外のユーザーがアクセスしたときに、管理者ユーザーアカウントをすべてユーザーリストから隠します。

上記の2つを組み合わせた最終的な解決策は、これを与えます...

function mc_admin_users_caps( $caps, $cap, $user_id, $args ){

    foreach( $caps as $key => $capability ){

        if( $capability != 'do_not_allow' )
            continue;

        switch( $cap ) {
            case 'edit_user':
            case 'edit_users':
                $caps[$key] = 'edit_users';
                break;
            case 'delete_user':
            case 'delete_users':
                $caps[$key] = 'delete_users';
                break;
            case 'create_users':
                $caps[$key] = $cap;
                break;
        }
    }

    return $caps;
}
add_filter( 'map_meta_cap', 'mc_admin_users_caps', 1, 4 );
remove_all_filters( 'enable_edit_any_user_configuration' );
add_filter( 'enable_edit_any_user_configuration', '__return_true');

/*
 * hide admin from user list
 */
add_action('pre_user_query','isa_pre_user_query');
function isa_pre_user_query($user_search) {
  $user = wp_get_current_user();
  if ($user->ID!=1) { // Is not administrator, remove administrator
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
  }
}
3
Aurovrata