কোনও ব্যবহারকারীর ভূমিকাকে কীভাবে তার স্তরের চেয়ে কম এমন একটি ভূমিকার অধীনে একটি নতুন ব্যবহারকারী তৈরি করতে দেওয়া যায়?


14

আমার সাইটে আমার অতিরিক্ত তিনটি ভূমিকা রয়েছে।

  1. ডাক্তার
  2. রিসেপশনিস্ট
  3. অতিথি

এই ভূমিকাগুলি নিম্নলিখিত কোড দ্বারা যুক্ত করা হয়:

* adding Doctor role */
$doctor_role = add_role('Doctor', __('Doctor'), array('read'=>'true'));

/* adding Receptionist role */
$receptionist_role = add_role('Receptionist', __('Receptionist'), array('read'=>'true'));

/* adding Guest role */
$guest_role = add_role('Guest', __('Guest'), array('read'=>'true'));

ডিফল্ট Administratorভূমিকা দ্বারা অন্যান্য সমস্ত ভূমিকা তৈরি করুন। তবে আমি ব্যবহারকারীর স্তর দ্বারা এই কার্যনির্বাহী ভূমিকা সীমাবদ্ধ করতে চাই। আমি যা বলতে চাই তা হল:

  1. প্রশাসক - সমস্ত ভূমিকা ব্যবহারকারী তৈরি করতে সক্ষম হওয়া উচিত - ডিফল্টরূপে সম্ভব।
  2. ডাক্তার - কেবলমাত্র ব্যবহারকারীদের তৈরি Receptionistএবং Guestভূমিকা রাখতে সক্ষম হওয়া উচিত
  3. রিসেপশনিস্ট - কেবলমাত্রGuest ভূমিকা ব্যবহারকারী তৈরি করতে সক্ষম হওয়া উচিত
  4. অতিথি - কোনও ব্যবহারকারী তৈরি করার অনুমতি নেই

এটি কিভাবে করতে পারে? কোনও প্লাগিন ব্যবহার না করে যদি আমি এটি অর্জন করতে পারি তবে ভাল।

উত্তর:


23

প্রথমত, আপনাকে নীচের ক্ষমতাগুলি Doctorএবং Receptionistভূমিকার সাথে যুক্ত করতে হবে:

  • list_users
  • edit_users
  • create_users
  • delete_users

এখন আমরা কোন ব্যবহারকারীরা তৈরি / সম্পাদনা / মুছতে পারি তা নিয়ন্ত্রণে কাজ করতে পারি। আসুন একটি "সহায়ক" ফাংশন দিয়ে শুরু করুন যা কোনও ব্যবহারকারীকে সম্পাদনা করার অনুমতিপ্রাপ্ত ভূমিকাগুলি ফিরে আসবে:

/**
 * Helper function get getting roles that the user is allowed to create/edit/delete.
 *
 * @param   WP_User $user
 * @return  array
 */
function wpse_188863_get_allowed_roles( $user ) {
    $allowed = array();

    if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles
        $allowed = array_keys( $GLOBALS['wp_roles']->roles );
    } elseif ( in_array( 'Doctor', $user->roles ) ) {
        $allowed[] = 'Receptionist';
        $allowed[] = 'Guest';
    } elseif ( in_array( 'Receptionist', $user->roles ) ) {
        $allowed[] = 'Guest';
    }

    return $allowed;
}

এবং তারা কোন ভূমিকা কোনও ব্যবহারকারীকে নির্ধারণ করতে পারে তা নির্ধারণ করতে:

/**
 * Remove roles that are not allowed for the current user role.
 */
function wpse_188863_editable_roles( $roles ) {
    if ( $user = wp_get_current_user() ) {
        $allowed = wpse_188863_get_allowed_roles( $user );

        foreach ( $roles as $role => $caps ) {
            if ( ! in_array( $role, $allowed ) )
                unset( $roles[ $role ] );
        }
    }

    return $roles;
}

add_filter( 'editable_roles', 'wpse_188863_editable_roles' );

এবং পরিশেষে, কোন ব্যবহারকারীরা তাদের ভূমিকার ভিত্তিতে সম্পাদনা / মুছতে পারে তা সীমাবদ্ধ করুন:

/**
 * Prevent users deleting/editing users with a role outside their allowance.
 */
function wpse_188863_map_meta_cap( $caps, $cap, $user_ID, $args ) {
    if ( ( $cap === 'edit_user' || $cap === 'delete_user' ) && $args ) {
        $the_user = get_userdata( $user_ID ); // The user performing the task
        $user     = get_userdata( $args[0] ); // The user being edited/deleted

        if ( $the_user && $user && $the_user->ID != $user->ID /* User can always edit self */ ) {
            $allowed = wpse_188863_get_allowed_roles( $the_user );

            if ( array_diff( $user->roles, $allowed ) ) {
                // Target user has roles outside of our limits
                $caps[] = 'not_allowed';
            }
        }
    }

    return $caps;
}

add_filter( 'map_meta_cap', 'wpse_188863_map_meta_cap', 10, 4 );

নিখুঁত ধন্যবাদ .. আমি ক্ষমতা এবং আপনার কোড যুক্ত করার পরে এটি আমাদের প্রত্যাশা অনুযায়ী কাজ করে। তবে Doctors, Receptionistএবং Guestতাদের নিজস্ব প্রোফাইলও সম্পাদনা করতে অক্ষম। আমি তাদের নিজের প্রোফাইল সম্পাদনা করতে চাই। আমি এটা কিভাবে করবো?
রিফাজ স্টার

হাই থিডিএমেডিক .. তুমি কি আছ? আমি আপনার উত্তর upvated করেছি। আপনি কি আমার উপরের মন্তব্যটি সন্ধান করতে পারবেন ??
রিফাজ স্টার

আমার সংশোধন পরীক্ষা করুন।
TheDeadMedic

@TheDeadMedic আপনার কোডটি আমাকে অনেক সাহায্য করেছে। আমার কেবল একটি সমস্যা আছে আমি এটি মাল্টিসাইটে ব্যবহার করি। এবং এই কোডটি আমার সমস্যার সমাধান করার সময় এটি অন্য একটি তৈরি করেছে। সুপার অ্যাডমিনিস্ট্রেটর হিসাবে লগ ইন করার সময় আমি সুপার প্রশাসকের নেটওয়ার্ক পৃষ্ঠা থেকে কোনও ভূমিকাই নির্বাচন করতে পারি না। আমি কীভাবে এটি সমাধান করব?
jockebq

1
এটি প্রশ্নের উজ্জ্বল উত্তর। ব্যাকরণগত ত্রুটিপূর্ণ এমনকি আমি এই ক্ষেত্রটিতে ওয়ার্ডপ্রেসের নিজস্ব ডকুমেন্টেশন পুরোপুরি অভাবে পেয়েছি। এটি সমস্যার সত্যই কার্যকর সমাধান।
বেনজি

0

উপরের উত্তরটি দুর্দান্ত কাজ করেছে। তবে ভূমিকাগুলির জন্য ছোট হাতের অক্ষর থাকা দরকার

function wpse_188863_get_allowed_roles( $user ) { }

এই ক্ষেত্রে:

if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles
    $allowed = array_keys( $GLOBALS['wp_roles']->roles );
} elseif ( in_array( 'doctor', $user->roles ) ) {
    $allowed[] = 'receptionist';
    $allowed[] = 'guest';
} elseif ( in_array( 'receptionist', $user->roles ) ) {
    $allowed[] = 'guest';
}

ভূমিকাগুলির ক্ষেত্রে সম্ভবত বেশিরভাগ ক্ষেত্রে ছোট হাতের অক্ষর হওয়া উচিত। উপরের উদাহরণে, স্লগ এবং নাম উভয়ই শিরোনাম কেস ব্যবহার করে দেওয়া হয়, সুতরাং এটি প্রযুক্তিগতভাবে সঠিক, যদিও প্রস্তাবিত নয়।
বেনজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.