web-dev-qa-db-ja.com

カスタムロールのユーザが管理者を削除または追加できないようにする

モデレーターのメモ:元のタイトルは「カスタムユーザーロール制限」でした)

私が取り組んでいるプロジェクトでは、2つの新しいユーザーロールを作成する必要があります。1つはWebサイトの所有者用、もう1つは会社のエージェント用です。

Webサイト所有者のユーザーロールで、他のすべての設定を変更するためのアクセス権を持ちながら、このグループのユーザーがコアサイトの設定を変更できないように制限する方法を探していました。

以下のコードは、ユーザー管理領域以外のすべてに対して完璧に機能するようです。私はこのグループのユーザーが問題に遭遇しているところでウェブサイトのユーザーを追加/修正できるようにしたかったのですが、現在このグループのユーザーは"Administratorにユーザーを作成することができます"categoryと既存の" Administrators "を削除することもできます。

私が探しているのは、そのようなユーザーが"Administrator"に設定されているユーザーアカウントを削除または変更できないように以下のコードを変更する方法です。新しい管理者アカウントを作成できないことから。

誰もがこれを行うことができる方法を知っていますか?

// CREATE CUSTOM - SITE OWNER - USER ROLE WITH CUSTOM CAPABILITIES
if (!get_role('website_owner')) {
  //let's use the editor as the base capabilities
  $caps = get_role('editor')->capabilities; 
  $caps = array_merge( $caps, array(
    'install_plugins'               => false,
    'activate_plugins'              => false,
    'update_plugins'                => false,
    'delete_plugins'                => false,
    'list_users'                    => true,
    'add_users'                     => true,
    'create_users'                  => true,
    'edit_users'                    => true,
    'delete_users'                  => true,
    'remove_users'                  => true,
    'unfiltered_upload'             => true,
    'install_themes'                => false,
    'update_themes'                 => false,
    'delete_themes'                 => false,
    'switch_themes'                 => false,
    'edit_theme_options'            => true,
    'manage_options'                => false,
    'import'                        => false,
    'update_core'                   => false,
    'edit_dashboard'                => false,
    'gravityforms_view_entries'     => true,
    'gravityforms_edit_entries'     => true,
    'gravityforms_delete_entries'   => true,
    'gravityforms_export_entries'   => true,
    'gravityforms_view_entry_notes' => true,
    'gravityforms_edit_entry_notes' => true,
    'gravityforms_feed'             => true,
  )); //adding new capabilities.
  // Ref: http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table
  add_role( 'website_owner', 'Website Owner', $caps );
}
6

こんにちは@ NetConstructor:

私はこれがあなたが必要としているものだと思います。私はあなたの'website_owner'ロールの完全なセットアップを含まず、'manage_administrators'と呼ばれる新しい機能を追加するだけであることに注意してください。

また、私は"Delete"リンクを'manage_administrators'ケーパビリティを持たないユーザーから削除しようとしました管理者ロールに追加する必要があります、もちろん)そして私はまたAdministratorをロールオプションとして削除しました"新しいユーザーの追加"ページ。悪意のある方法で管理者を削除または追加できないようにすることはしませんでした。管理者を追加または削除できるようにするその他の機能を無効にすることもしませんでした。とは言っても、これで十分でしょうか。

add_action('user_row_actions','yoursite_user_row_actions',10,2);
function yoursite_user_row_actions($actions, $user_object) {  // remove the ability to delete an administrator
  global $pagenow;
  if ($pagenow=='users.php' && isset($user_object->caps['administrator']) && !current_user_can('manage_administrators'))
    unset($actions['edit']);
    unset($actions['delete']);
  return $actions;
}
add_action('editable_roles','yoursite_editable_roles');
function yoursite_editable_roles($all_roles) { // remove the ability to add an administrator
  global $pagenow;
if (in_array($pagenow,array('user-edit.php','user-new.php')) &&           
       !current_user_can('manage_administrators'))
    unset($all_roles['administrator']);
  return $all_roles;
}
add_action('admin_init','yoursite_admin_init');
function yoursite_admin_init() {
  $wp_roles = new WP_Roles();
  $wp_roles->use_db = true;
  $administrator = $wp_roles->get_role('administrator');
  if (!$administrator->has_cap('manage_administrators'))
    $wp_roles->add_cap('administrator','manage_administrators');

  $website_owner = $wp_roles->get_role('website_owner');
  if (!$website_owner) {
    //let's use the editor as the base capabilities
    $caps = get_role('editor')->capabilities;
    $caps = array_merge( $caps, array(
      'install_plugins'               => false,
      'activate_plugins'              => false,
      'update_plugins'                => false,
      'delete_plugins'                => false,
      'list_users'                    => true,
      'add_users'                     => true,
      'create_users'                  => true,
      'edit_users'                    => true,
      'delete_users'                  => true,
      'remove_users'                  => true,
      'unfiltered_upload'             => true,
      'install_themes'                => false,
      'update_themes'                 => false,
      'delete_themes'                 => false,
      'switch_themes'                 => false,
      'edit_theme_options'            => true,
      'manage_options'                => false,
      'import'                        => false,
      'update_core'                   => false,
      'edit_dashboard'                => false,
      'gravityforms_view_entries'     => true,
      'gravityforms_edit_entries'     => true,
      'gravityforms_delete_entries'   => true,
      'gravityforms_export_entries'   => true,
      'gravityforms_view_entry_notes' => true,
      'gravityforms_edit_entry_notes' => true,
      'gravityforms_feed'             => true,
      'manage_administrators'         => false,
    ));
    $wp_roles->add_role('website_owner','Website Owner',$caps);
  }
}
9
MikeSchinkel

私は今これが map_meta_cap を使って行われることを意味していると思います:

たとえば、IDが1の管理ユーザーの削除や編集をブロックするには、次のようにします。

add_filter('map_meta_cap', function( $required_caps, $cap, $user_id, $args ){

   $protected_user = 1; // ID of admin user you want to block from being edited

    if ( $user_id === $protected_user ) // Don't block caps if current user = protected user
        return $required_caps;
    $blocked_caps = array(
        'delete_user',
        'edit_user',
        'remove_user'
        );
    if ( in_array( $cap, $blocked_caps ) && $args[0] === $protected_user )
        $required_caps[] = 'do_not_allow';
    return $required_caps;
}, 10, 4 );

ブロックしたい機能を$blocked_caps配列に追加することができます。

wp-admin/users.phpページから身​​を隠すためにこれも追加します。おそらくphpでユーザーの設定を解除するほうが良いでしょうが、上記の関数を使用している場合は管理者を編集できないため、実際には違いはありません。

function hide_admin_user_bw() {
  ?>
    <style type="text/css">
    .users-php tr#user-1 {
        display: none!important;
    }
    .users-php li.administrator {
        display: none!important;
    }
    </style>
  <?php
}
add_action('admin_head-users.php', 'hide_admin_user_bw');
0
Bryan Willis