Editör yönetici dışında herhangi bir yeni kullanıcı oluşturabilir


36

Bir müşteri için bir WordPress sitesi kurdum. İstemci Editör rolüne sahip, ancak Üyeler eklentisini yükledim ve müşteriye WP yöneticisine yeni kullanıcılar ekleme yeteneği verdim . Bu iyi çalışıyor.

Sahip olduğum soru, müşteriden bir Katılımcı, Abone, Editör ve Yazar'ın rolüyle olduğu gibi yeni bir kullanıcı oluşturma yeteneğine sahip olmasını istemem, ancak Yönetici DEĞİLDİR. İstemcinin oluşturduğu yeni kullanıcılar Yönetici rolüne sahip olmamalıdır. Bu seçeneği bir şekilde gizlemek mümkün mü?

Teşekkürler Vayu


2
Lütfen kullandığınız eklentiyi bağlayın, hangisini kastettiğinizi bulmakta sorun yaşadım.
hakre

Yanıtlar:


39

Aslında oldukça kolay. map_meta_capsDüzenleyicilere filtre uygulayıp yönetici oluşturmasını engellemeniz ve yönetici rolünü 'düzenlenebilir roller' dizisinden kaldırmanız gerekir. Bu sınıf, bir eklenti olarak veya temanızın functions.php dosyasında şunları yapar:

class JPB_User_Caps {

  // Add our filters
  function __construct(){
    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();

DÜZENLE

Tamam, neden kullanıcının silme işleminin kaymasına izin verdiğine bir göz attım. Delete_user, edit_user'den biraz farklı şekilde ele alınmış gibi görünüyor; Bu sorunu gidermek için map_meta_cap yöntemini değiştirdim. 3.0.3'te test ettim ve bu, yöneticilerden başka birinin yöneticiyi gerçekten silmesini, düzenlemesini veya oluşturmasını önleyecektir.

EDIT 2

Kodu @ bugnumber9 'ın cevabını aşağıya yansıtacak şekilde güncelledim. Lütfen git ve o cevabı bir oy ver!


Birisi bu kodun diğerlerinin yöneticileri silmesini önlediğini doğrulayabilir mi? Bu davranışı çoğaltamam. Bu ... düzenlemelerini engelleyebilirsiniz, ama vurgulu bağlantı görünmeye devam "Sil" ve WP silinmesi ile geçmesi için izin verir
somatik

@somatic - sen yerinde idi. Gösterdiğin için teşekkürler. Sorun şimdi düzeltildi.
John P Bloch

Bunu da yapmam gerekiyor ama bu kodu nereye koyduğumdan emin değilim! Functions.php içinde? Değilse, function.php ile çalışmak nasıl yapılabilir? en iyi, Dc
v3nt

@daniel ilk paragrafı okudu.
John P Bloch

1
3.4.1'de harika çalıştı, teşekkürler! Create_users, delete_users, add_users, remove_users, edit_users, list_users ve promote_users için yetenekler eklediğinizden emin olun
Jon Raasch

8

~ 7 yaşında olmasına rağmen, bu iplik kolayca döndürülebilir ve hala çalışan bir çözüm sunar. @ John P Bloch tarafından sağlanan kodu kastediyorum.

Bununla birlikte, PHP 7 altında aşağıdaki gibi kritik olmayan bir hata (PHP Deprecated) üretti:

PHP Kullanımdan Kaldırıldı: Sınıflarıyla aynı adı taşıyan yöntemler PHP'nin gelecekteki bir sürümünde yapıcı olmayacak; JPB_User_Caps içinde ... kullanımından kaldırılmış bir kurucuya sahip ...

Bunu düzeltmek için bu parçayı değiştirin:

// 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);
  }

Bununla:

// Add our filters
  function __construct() {
    add_filter( 'editable_roles', array(&$this, 'editable_roles') );
    add_filter( 'map_meta_cap', array(&$this, 'map_meta_cap'), 10, 4 );
  }

Bu sorunu çözecektir.


1
Teşekkürler teşekkürler teşekkürler. Kod kalitesine olan bağlılığımı takdir ediyorum ve sıradan çalışanların da not alabilmesi için cevabımı güncelledim. Harikasın!
John P Bloch

3

Editörün sadece menüleri düzenleyebileceği ve bir eklentiye ihtiyaç duymadan kullanıcıları yaratacağı / düzenleyebileceği bir çözüm arıyordum. Bu yüzden ilgilenenler için yaptım.

// Customizes 'Editor' role to have the ability to modify menus, add new users
// and more.
class Custom_Admin {
    // Add our filters
    public function __construct(){
        // Allow editor to edit theme options (ie Menu)
        add_action('init', array($this, 'init'));
        add_filter('editable_roles', array($this, 'editable_roles'));
        add_filter('map_meta_cap', array($this, 'map_meta_cap'), 10, 4);
    }

    public function init() {
        if ($this->is_client_admin()) {
            // Disable access to the theme/widget pages if not admin
            add_action('admin_head', array($this, 'modify_menus'));
            add_action('load-themes.php', array($this, 'wp_die'));
            add_action('load-widgets.php', array($this, 'wp_die'));
            add_action('load-customize.php', array($this, 'wp_die'));

            add_filter('user_has_cap', array($this, 'user_has_cap'));
        }
    }

    public function wp_die() {
        _default_wp_die_handler(__('You do not have sufficient permissions to access this page.'));
    }

    public function modify_menus() 
    {
        remove_submenu_page( 'themes.php', 'themes.php' ); // hide the theme selection submenu
        remove_submenu_page( 'themes.php', 'widgets.php' ); // hide the widgets submenu

        // Appearance Menu
        global $menu;
        global $submenu;
        if (isset($menu[60][0])) {
            $menu[60][0] = "Menus"; // Rename Appearance to Menus
        }
        unset($submenu['themes.php'][6]); // Customize
    }

    // Remove 'Administrator' from the list of roles if the current user is not an admin
    public function editable_roles( $roles ){
        if( isset( $roles['administrator'] ) && !current_user_can('administrator') ){
            unset( $roles['administrator']);
        }
        return $roles;
    }

    public function user_has_cap( $caps ){
        $caps['list_users'] = true;
        $caps['create_users'] = true;

        $caps['edit_users'] = true;
        $caps['promote_users'] = true;

        $caps['delete_users'] = true;
        $caps['remove_users'] = true;

        $caps['edit_theme_options'] = true;
        return $caps;
    }

    // If someone is trying to edit or delete and admin and that user isn't an admin, don't allow it
    public function map_meta_cap( $caps, $cap, $user_id, $args ){
        // $args[0] == other_user_id
        foreach($caps as $key => $capability)
        {
            switch ($cap)
            {
                case 'edit_user':
                case 'remove_user':
                case 'promote_user':
                    if(isset($args[0]) && $args[0] == $user_id) {
                        break;
                    }
                    else if(!isset($args[0])) {
                        $caps[] = 'do_not_allow';
                    }
                    // Do not allow non-admin to edit admin
                    $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;
                    }
                    // Do not allow non-admin to delete admin
                    $other = new WP_User(absint($args[0]));
                    if( $other->has_cap( 'administrator' ) ){
                        if(!current_user_can('administrator')){
                            $caps[] = 'do_not_allow';
                        }
                    }
                    break;
                break;
            }
        }
        return $caps;
    }

    // If current user is called admin or administrative and is an editor
    protected function is_client_admin() {
        $current_user = wp_get_current_user();
        $is_editor = isset($current_user->caps['editor']) ? $current_user->caps['editor'] : false;
        return ($is_editor);
    }
}
new Custom_Admin();

1

@John P Blochs çözümü hala iyi çalışıyor, ancak 'map_meta_cap' için küçük filtreme de atabileceğimi düşündüm. Sadece biraz daha kısa ve daha temiz, en azından gözlerim için;)

function my_map_meta_cap( $caps, $cap, $user_id, $args ) {
  $check_caps = [
    'edit_user',
    'remove_user',
    'promote_user',
    'delete_user',
    'delete_users'
  ];
  if( !in_array( $cap, $check_caps ) || current_user_can('administrator') ) {
    return $caps;
  }
  $other = get_user_by( 'id', $args[0] ?? false ); // PHP 7 check for variable in $args... 
  if( $other && $other->has_cap('administrator') ) {
    $caps[] = 'do_not_allow';
  }
  return $caps;
}
add_filter('map_meta_cap', 'my_map_meta_cap', 10, 4 );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.