web-dev-qa-db-ja.com

管理者ユーザがユーザリストからスーパー管理者を編集/参照できないようにします

自分のスーパー管理者をユーザーリストから隠すにはどうすればよいですか?私のクライアントはユーザーを作成する能力である必要がありますが、私のスーパーアドミンユーザーを編集/参照することはできません。それは可能ですか?

1
Carol

私は以下をお勧めします。

WordPressの編集者ユーザーロールは、デフォルトではユーザーを編集できません。あなたがあなたが '編集者'として保持しているクライアントのためにその機能を追加したいかもしれません。これにより、エディターは新規ユーザーの追加(新規ユーザーの作成)、ユーザーの削除、およびユーザーの編集を行うことができます。これは 'add_cap'で編集者ロールに機能を追加することによって行われます。

これにより、編集者はユーザーを管理できます

function wpse104808_editor_manage_users() {

    if ( get_option( 'wpse104808_add_cap_editor_once' ) != 'done' ) {

        // let editor manage users

        $edit_editor = get_role('editor'); // Get the user role
        $edit_editor->add_cap('edit_users');
        $edit_editor->add_cap('list_users');
        $edit_editor->add_cap('promote_users');
        $edit_editor->add_cap('create_users');
        $edit_editor->add_cap('add_users');
        $edit_editor->add_cap('delete_users');

        update_option( 'wpse104808_add_cap_editor_once', 'done' );
    }

}
add_action( 'init', 'wpse104808_editor_manage_users' );

編集者が管理者ユーザーを削除できないようにする

これにより、編集者による新しい管理者の削除、編集、追加ができなくなります。

class wpse104808_user_caps {

  // Add our filters
  function wpse104808_user_caps(){
    add_filter( 'editable_roles', array(&$this, 'editable_roles'));
    add_filter( 'map_meta_cap', array(&$this, 'map_meta_cap'),10,4);
  }
  // Remove 'Administrator' from the list of roles if the current user is not an admin
  function editable_roles( $roles ){
    if( isset( $roles['administrator'] ) && !current_user_can('administrator') ){
      unset( $roles['administrator']);
    }
    return $roles;
  }
  // If someone is trying to edit or delete an
  // admin and that user isn't an admin, don't allow it
  function map_meta_cap( $caps, $cap, $user_id, $args ){
    switch( $cap ){
        case 'edit_user':
        case 'remove_user':
        case 'promote_user':
            if( isset($args[0]) && $args[0] == $user_id )
                break;
            elseif( !isset($args[0]) )
                $caps[] = 'do_not_allow';
            $other = new WP_User( absint($args[0]) );
            if( $other->has_cap( 'administrator' ) ){
                if(!current_user_can('administrator')){
                    $caps[] = 'do_not_allow';
                }
            }
            break;
        case 'delete_user':
        case 'delete_users':
            if( !isset($args[0]) )
                break;
            $other = new WP_User( absint($args[0]) );
            if( $other->has_cap( 'administrator' ) ){
                if(!current_user_can('administrator')){
                    $caps[] = 'do_not_allow';
                }
            }
            break;
        default:
            break;
    }
    return $caps;
  }

}

$wpse104808_custom_role = new wpse104808_user_caps();

ユーザーリストから管理者を隠す

ユーザーリストからユーザーを隠す3つのバリエーションがあります。以下の1つを選択してください

オプション1:ユーザーリストから特定のユーザーを隠す

ユーザーリストから隠すために個々のIDを選択したい場合は、これを使用してください( '2,5,7,9'を隠したいユーザーIDに置き換えてください)

add_action('pre_user_query','wpse104808_pre_user_query');
function wpse104808_pre_user_query($user_search) {

    $admin_ids = '2,5,7,9'; // REPLACE THESE NUMBERS WITH IDs TO HIDE.

    $user = wp_get_current_user();
    $admin_array = explode($admin_ids, ',');
    if ( ! in_array( $user->ID, $admin_array ) ) {
        global $wpdb;
        $user_search->query_where = str_replace('WHERE 1=1', "WHERE 1=1 AND {$wpdb->users}.ID NOT IN($admin_ids)",$user_search->query_where);

    }
}

オプション2:ユーザーリストからすべての管理者を隠す

// Hide all administrators from user list.

add_action('pre_user_query','wpse104808_pre_user_query');
function wpse104808_pre_user_query($user_search) {

    $user = wp_get_current_user();

    if ( ! current_user_can( 'manage_options' ) ) {

        global $wpdb;

        $user_search->query_where = 
            str_replace('WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
                 SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
                    WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}capabilities'
                    AND {$wpdb->usermeta}.meta_value NOT LIKE '%administrator%')", 
            $user_search->query_where
        );

    }
}

関連リンク:
- 役割と機能
- add cap
- WP_Role::add_cap
- WP_User::add_cap

4

これはあなたを助けるでしょう、私は推測します(あなたが適切なユーザを隠していることを確認するだけである):

他のユーザーがユーザーリストの管理者を表示する機能を削除しますか?

これも見てください。

ユーザーを追加および表示するロールを持つユーザーからアドミニストレータハイパーリンクを削除します

0