問題描述

我已經為客户設置了一個 WordPress 站點。客户端具有編輯器角色,但是我已經安裝了 Members plugin,並給予客户端添加新用户到 WP 管理員的功能。這是正常工作。

我的問題是,我希望客户能夠創建新用户,與貢獻者,訂閲者,編輯者和作者,而不是管理員的角色一樣。客户端創建的新用户不應具有管理員角色。有可能以某種方式隱藏此選項嗎?

謝謝 Vayu

最佳解決方案

其實很簡單您需要過濾到 map_meta_caps 並停止編輯器創建/編輯管理員,並從’editable roles’ 數組中刪除管理員角色。這個類,作為一個插件或在你的主題的 functions.php 文件中會做到這一點:

class JPB_User_Caps {

  // Add our filters
  function JPB_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 and 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;
  }

}

$jpb_user_caps = new JPB_User_Caps();

EDIT

好的,所以我看看為什麼讓用户刪除通過。看起來 delete_user 處理與 edit_user 略有不同; 我修改了 map_meta_cap 方法來解決這個問題。我已經在 3.0.3 上測試過,這樣可以防止任何人,但管理員實際上刪除,編輯或創建管理員。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。