किसी भूमिका के तहत एक उपयोगकर्ता को एक नई भूमिका बनाने की अनुमति कैसे दी जाए जो केवल उसके स्तर से कम हो?


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. अतिथि - किसी भी उपयोगकर्ता को बनाने की अनुमति नहीं है

यह कैसे कर सकते हैं? बेहतर होगा अगर मैं किसी भी प्लगइन्स का उपयोग किए बिना इसे प्राप्त कर सकता हूं।

जवाबों:


24

सबसे पहले, आपको निम्नलिखित क्षमताओं को 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अपनी स्वयं की प्रोफाइल को भी संपादित करने में असमर्थ हैं। मैं चाहता हूं कि वे अपनी प्रोफ़ाइल संपादित करें। मैं उसे कैसे कर सकता हूँ?
रिफ़ाज़ स्टार

हाय TheDeadMedic .. क्या तुम वहाँ हो? मैंने उर उत्तर दिया है। क्या आप मेरी उक्त टिप्पणी को देख सकते हैं ??
रिफ़ाज़ स्टार

मेरे संशोधन की जाँच करें।
TheDeadMedic

@ TheDeadMedic आपके कोड ने मुझे बहुत मदद की। मुझे केवल एक ही परेशानी है। मैं एक मल्टीसाइट पर इसका उपयोग करता हूं। और जब इस कोड ने मेरी समस्या हल कर दी, तो इसने एक और निर्माण किया। जब मुझे सुपर एडमिनिस्ट्रेटर के रूप में लॉग इन किया जाता है तो मैं सुपर एडमिन के नेटवर्क पेज से किसी भी भूमिका का चयन नहीं कर सकता। मैं इसे कैसे हल करूं?
जॉकब

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';
}

अधिकांश मामलों में भूमिकाओं का मामला कम होना चाहिए। उपरोक्त उदाहरण में, स्लग और नाम दोनों शीर्षक मामले का उपयोग करके दिए गए हैं, इसलिए यह तकनीकी रूप से सही है, हालांकि अनुशंसित नहीं है।
बेंजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.