संपादक व्यवस्थापक को छोड़कर कोई भी नया उपयोगकर्ता बना सकता है


36

मैंने एक क्लाइंट के लिए एक वर्डप्रेस साइट स्थापित की है। क्लाइंट की संपादक की भूमिका है, हालांकि मैंने सदस्य प्लगइन स्थापित किया है और ग्राहक को WP व्यवस्थापक में नए उपयोगकर्ता जोड़ने की क्षमता दी है। यह ठीक काम कर रहा है।

मेरे पास प्रश्न यह है कि मैं ग्राहक के लिए नए उपयोगकर्ता बनाने की क्षमता के साथ एक योगदानकर्ता, सब्सक्राइबर, संपादक और लेखक की भूमिका निभाना चाहूंगा, लेकिन प्रशासक नहीं। ग्राहक जो नए उपयोगकर्ता बनाता है, उसमें व्यवस्थापक की भूमिका नहीं होनी चाहिए। क्या इस विकल्प को किसी तरह छिपाना संभव है?

धन्यवाद वायु


2
कृपया उस प्लगइन को लिंक करें जिसका आप उपयोग कर रहे हैं, मुझे यह पता लगाने में समस्या थी कि आप किसका उल्लेख कर रहे हैं।
हकर्रे

जवाबों:


39

यह वास्तव में बहुत आसान है। आपको map_meta_capsएडिटर्स बनाने / संपादित करने से संपादकों को फ़िल्टर करने और रोकने की आवश्यकता है , और व्यवस्थापक भूमिका को 'संपादन योग्य भूमिकाएँ' सरणी से हटा दें। यह वर्ग, एक प्लगइन के रूप में या आपके विषय के functions.php फ़ाइल में ऐसा करेगा:

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();

संपादित करें

ठीक है, इसलिए मैंने इस पर ध्यान दिया कि यह उपयोगकर्ता को हटाने की पर्ची क्यों दे रहा है। ऐसा लगता है कि edit_user को edit_user से थोड़ा अलग तरीके से संभाला गया है; मैंने इसके चारों ओर काम करने के लिए map_meta_cap विधि को संशोधित किया है। मैंने 3.0.3 पर परीक्षण किया है और यह वास्तव में हटाने, संपादित करने, या व्यवस्थापक बनाने से किसी भी लेकिन व्यवस्थापकों को रोक देगा।

EDIT 2

मैंने नीचे @ Bugnumber9 के उत्तर को दर्शाने के लिए कोड अपडेट किया। कृपया उस उत्तर का उत्तर दें!


क्या कोई यह सत्यापित कर सकता है कि यह कोड दूसरों को प्रवेश हटाने से रोकता है? मैं उस व्यवहार को पुन: पेश नहीं कर सकता। यह उन्हें संपादन करने से रोकता है, लेकिन "हटाएं" हॉवर लिंक अभी भी दिखाई देता है, और WP उपयोगकर्ता को विलोपन से गुजरने की अनुमति देता है ...
दैहिक

@somatic - आप पर हाजिर थे। यह बात बताने के लिए धन्यवाद। मुद्दा अब तय हो गया है।
जॉन पी बलोच

मैं यह भी करने की जरूरत है, लेकिन अनिश्चित है कि मैं यह कोड कहां डालूं! कार्यों में। यदि नहीं, तो इसे कार्यों से कैसे किया जा सकता है। सबसे अच्छा, डीसी
v3nt

@ डैनियल ने पहला पैराग्राफ पढ़ा।
जॉन पी बलोच

1
3.4.1 में महान काम किया, धन्यवाद! Create_users, delete_users, add_users, remove_users, edit_users, list_users और Prom_users
Jon Raasch

8

~ 7 वर्ष का होने के बावजूद, इस धागे को आसानी से गुहाया जा सकता है और अभी भी एक काम कर समाधान प्रदान करता है। मेरा मतलब @John P Bloch द्वारा प्रदान किया गया कोड है।

कहा कि PHP 7 के तहत, यह एक गैर-महत्वपूर्ण त्रुटि (PHP पदावनत) का उत्पादन इस प्रकार करता है:

PHP पदावनत: PHP के भविष्य के संस्करण में उनके वर्ग के समान नाम वाले विधायक नहीं होंगे; 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);
  }

इसके साथ:

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

इससे समस्या ठीक हो जाएगी।


1
धन्यवाद धन्यवाद धन्यवाद। मैं कोड गुणवत्ता के प्रति समर्पण की सराहना करता हूं और अपने जवाब को अपडेट किया है ताकि आकस्मिक गुगलों को भी मेमो मिल सके। आपने धमाल मचाया!
जॉन पी बलोच

3

मैं एक ऐसे समाधान की तलाश में था जहाँ संपादक केवल मेन्यू को संपादित कर सके और बिना प्लगइन की आवश्यकता के उपयोगकर्ताओं को बना / संपादित कर सके। इसलिए मैंने इसे दिलचस्पी रखने वालों के लिए बनाया।

// 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

@ जॉन पी ब्लॉक्स समाधान अभी भी ठीक काम करता है, लेकिन मुझे लगा कि मैं अपने छोटे से फिल्टर में 'map_meta_cap' के लिए भी फेंक दूंगा। बस थोड़ा कम और क्लीनर, कम से कम मेरी आँखों के लिए;)

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 );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.