সম্পাদক প্রশাসক ব্যতীত যে কোনও নতুন ব্যবহারকারী তৈরি করতে পারেন


36

আমি একটি ক্লায়েন্টের জন্য একটি ওয়ার্ডপ্রেস সাইট স্থাপন করেছি। ক্লায়েন্টটির সম্পাদকের ভূমিকা রয়েছে, তবে আমি সদস্য প্লাগইন ইনস্টল করেছি এবং ক্লায়েন্টকে ডাব্লুপি অ্যাডমিনে নতুন ব্যবহারকারী যুক্ত করার ক্ষমতা দিয়েছি । এটি ঠিক কাজ করছে।

আমার কাছে প্রশ্নটি হ'ল আমি ক্লায়েন্টের পক্ষে কোনও অবদানকারী, সাবস্ক্রাইবার, সম্পাদক এবং লেখক, তবে প্রশাসকের নয় এমন ভূমিকা হিসাবে নতুন ব্যবহারকারী তৈরি করার ক্ষমতা অর্জন করতে চাই। ক্লায়েন্ট তৈরি করা নতুন ব্যবহারকারীদের প্রশাসকের ভূমিকা থাকা উচিত নয়। এই বিকল্পটি কোনওভাবে লুকিয়ে রাখা কি সম্ভব?

ধন্যবাদ ভাইয়ু


2
আপনি যে প্লাগইনটি ব্যবহার করছেন তা দয়া করে লিঙ্ক করুন, আপনি কোনটি উল্লেখ করছেন তা জানতে আমার সমস্যা হয়েছিল।
hakre

উত্তর:


39

এটি আসলে বেশ সহজ। আপনাকে map_meta_capsসম্পাদকদের অ্যাডমিন তৈরি / সম্পাদনা করা থেকে ফিল্টার করা এবং বন্ধ করতে হবে, এবং 'সম্পাদনযোগ্য ভূমিকা' অ্যারে থেকে প্রশাসকের ভূমিকা মুছে ফেলতে হবে। এই শ্রেণিটি, প্লাগইন হিসাবে বা আপনার থিমের ফাংশন.এফপি ফাইল এটি করবে:

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 থেকে কিছুটা আলাদাভাবে পরিচালনা করা হয়; এটিকে ঘিরে কাজ করার জন্য আমি মানচিত্র_মেটা_ক্যাপ পদ্ধতিটি পরিবর্তন করেছি। আমি .3.০.৩ এ পরীক্ষা করেছি এবং এটি অ্যাডমিনিস্ট্রেটরদের অপসারণ থেকে প্রশাসককে মুছে ফেলা, সম্পাদনা করতে বা তৈরি করতে বাধা দেবে।

সম্পাদনা 2

নীচে @ bugnumber9 এর উত্তর প্রতিফলিত করার জন্য আমি কোডটি আপডেট করেছি। অনুগ্রহ করে উত্তরটি দাও!


কেউ এই যাচাই করতে পারেন যে এই কোডটি অন্যদের প্রশাসকদের মুছতে বাধা দেয়? আমি সেই আচরণটির পুনরুত্পাদন করতে পারি না। এটি তাদের সম্পাদনা থেকে বাধা দেয় না, তবে "মোছা" হোভার লিঙ্কটি এখনও উপস্থিত হয় এবং ডব্লিউপি ব্যবহারকারীকে মুছে ফেলার মাধ্যমে যেতে দেয় ...
সোম্যাটিক

@ সুমেটিক - আপনি স্পট ছিল। যে ইশারা জন্য ধন্যবাদ। বিষয়টি এখন ঠিক হয়ে গেছে।
জন পি ব্লচ

আমার এটিও করা দরকার তবে আমি এই কোডটি কোথায় রেখেছি তা নিশ্চিত নই! ফাংশন.ফ্যাপে? যদি না হয় তবে কীভাবে এটি ফাংশন.এফপি থেকে কাজ করা যায়? সেরা, ডিসি
v3nt

@ ড্যানিয়েল প্রথম অনুচ্ছেদটি পড়ুন।
জন পি ব্লচ

1
3.4.1 এ দুর্দান্ত কাজ করেছেন, ধন্যবাদ! ক্রিয়েটিউজার্স, ডিলিট_ইউসারস, অ্যাড_উসারস, রিমুভাল ইউজারস, এডিট_উসারস, লিস্ট_ইউসারস এবং প্রোমোশন_উসারদের জন্য দক্ষতা যুক্ত করার বিষয়টি নিশ্চিত করুন
জন রাশ

8

Years 7 বছর বয়সী হওয়া সত্ত্বেও, এই থ্রেডটি সহজেই গুগল করা যায় এবং এখনও একটি কার্যকরী সমাধান সরবরাহ করে। আমি বলতে চাইছি @ জন পি ব্লচ প্রদত্ত কোড।

এটি বলেছিল যে পিএইচপি 7 এর অধীনে এটি একটি অ-সমালোচনামূলক ত্রুটি (পিএইচপি হ্রাসপ্রাপ্ত) উত্পাদন করে:

পিএইচপি অবহেলিত: পিএইচপি এর ভবিষ্যত সংস্করণে তাদের শ্রেণীর মতো একই নামের পদ্ধতিগুলি নির্মাণকারী হবে না; 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

@ জন পি ব্লাচস সমাধান এখনও ভাল কাজ করে, তবে আমি ভেবেছিলাম যে আমি 'ম্যাপ_মেটা_ক্যাপ' এর জন্য আমার ছোট্ট ফিল্টারটিও ফেলে দেব। কমপক্ষে আমার চোখের জন্য, কেবল একটু খাটো এবং ক্লিনার;)

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 );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.