यदि वर्तमान उपयोगकर्ता एक व्यवस्थापक या संपादक है


100

मैं यह देखने के लिए कैसे जांच कर सकता हूं कि क्या वर्तमान लॉग-इन उपयोगकर्ता प्रशासक या संपादक है?

मुझे पता है कि प्रत्येक को व्यक्तिगत रूप से कैसे करना है:

<?php if(current_user_can('editor')) { ?> 
    <!-- Stuff here for editors -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Stuff here for administrators -->
<?php } ?>

लेकिन मैं उन लोगों को एक साथ कैसे काम करूं? यानी, उपयोगकर्ता एक व्यवस्थापक या संपादक है?


10
if( current_user_can('editor') || current_user_can('administrator') )
शजाद

जवाबों:


189

पहला उत्तर, वर्डप्रेस-संबंधी नहीं क्योंकि यह केवल PHP है: तर्क "OR" ऑपरेटर का उपयोग करें:

<?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?>
    // Stuff here for administrators or editors
<?php } ?>

यदि आप दो से अधिक भूमिकाओं की जाँच करना चाहते हैं, तो आप यह जाँच सकते हैं कि वर्तमान उपयोगकर्ता की भूमिकाएँ किसी भूमिका के अंदर हैं या नहीं, कुछ इस तरह हैं:

$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
<?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?>
   // Stuff here for allowed roles
<?php } ?>

हालांकि, current_user_canन केवल उपयोगकर्ताओं की भूमिका के नाम के साथ, बल्कि क्षमताओं के साथ भी इस्तेमाल किया जा सकता है।

इसलिए, जब दोनों संपादक और व्यवस्थापक पृष्ठ संपादित कर सकते हैं, तो आपका जीवन उन क्षमताओं के लिए आसान हो सकता है:

<?php if( current_user_can('edit_others_pages') ) {  ?>
    // Stuff here for user roles that can edit pages: editors and administrators
<?php } ?>

क्षमताओं के बारे में अधिक जानकारी के लिए यहां एक नज़र डालें ।


क्या आपको जांचने की आवश्यकता है कि is_logged_in();क्या है?
रॉबेंज

3
@RobBenz नहीं, किसी भी मामले में। क्योंकि current_user_can()उपयोगकर्ता के लॉग इन नहीं होने पर हमेशा गलत रिटर्न देता है, और wp_get_current_user()यदि उपयोगकर्ता लॉग इन नहीं होता है तो किसी भी भूमिका के बिना उपयोगकर्ता को लौटा देगा, इसलिए array_intersect()इच्छा हमेशा झूठी होगी।
gmazzap

1
current_user_can()फ़ंक्शन के PHPDoc में , हम लाइन को देख सकते हैं " एक क्षमता के स्थान पर विशेष भूमिकाओं के खिलाफ जांच करते समय भाग में समर्थित है, यह अभ्यास हतोत्साहित किया जाता है क्योंकि यह अविश्वसनीय परिणाम उत्पन्न कर सकता है "। इसलिए मुझे लगता है कि उपयोगकर्ता की क्षमता की जाँच करते समय भूमिकाओं का उपयोग करने से बचना बेहतर होगा :-)
एरेनोर पाज़

जब मैं array_intersectविधि का उपयोग करता हूं, तो मुझे हमारे सर्वर त्रुटि लॉग कहने में एक PHP चेतावनी मिलती है array_intersect(): Argument #2 is not an array। क्या यह इसलिए है क्योंकि उपयोगकर्ता (नों) की जाँच केवल एक भूमिका है?
गार्कोनिस

@Garconis आम तौर पर यह एक सरणी होना चाहिए। किसी कारण से यह आपके लिए एक सरणी नहीं है। array_intersect($allowed_roles, (array)$user->roles )कोई समस्या नहीं के साथ काम करेंगे।
gmazzap

9

सबसे पहले, current_user_can()उपयोगकर्ता की भूमिका की जांच करने के लिए उपयोग नहीं किया जाना चाहिए - यह जांचने के लिए उपयोग किया जाना चाहिए कि क्या उपयोगकर्ता की कोई विशिष्ट क्षमता है

दूसरा, उपयोगकर्ता की भूमिका से चिंतित होने के बजाय, लेकिन क्षमताओं पर ध्यान केंद्रित करने के बजाय, आपको मूल प्रश्न में समस्या के बारे में बात करने से परेशान होने की ज़रूरत नहीं है (जो यह जाँच रहा है कि उपयोगकर्ता एक व्यवस्थापक या एक संपादक है)। इसके बजाय, यदि current_user_can()इरादा के रूप में इस्तेमाल किया जा रहा था, जो एक उपयोगकर्ता की क्षमताओं के लिए जांचना है, उनकी भूमिका नहीं है , तो आपको "या" (()) परीक्षण शामिल करने के लिए सशर्त जांच की आवश्यकता नहीं होगी। उदाहरण के लिए:

if ( current_user_can( 'edit_pages' ) ) { ...

edit_pages प्रशासक और संपादक दोनों भूमिकाओं की एक क्षमता है, लेकिन लेखक जैसी कोई कम भूमिका नहीं। इस तरह इसका उपयोग करने current_user_can()का इरादा था।


कृपया ध्यान दें : उच्च स्तरीय WP devs इस उत्तर से सहमत हैं। आपको जितना संभव हो भूमिका की जाँच से बचने की कोशिश करनी चाहिए, कैपबिलिटी का उपयोग करना चाहिए। मैं वर्तमान में कई भूमिकाओं वाली एक परियोजना पर काम कर रहा हूं जिसमें केवल 'रीड' कैप है। एकमात्र समाधान मेरे लिए भूमिका जाँच है। क्षमा करें, मुझे लिंक नहीं मिल रहा है, यह WP Github पर एक खुली चर्चा थी।
ब्योर्न

यह स्वीकृत उत्तर होना चाहिए, IMO। current_user_canआमतौर पर क्षमताओं के लिए इस्तेमाल किया जाना चाहिए, न कि भूमिकाओं के लिए।
आर्मस्ट्रांगेस्ट

2

जैसा कि @butlerblog उत्तर में कहा गया है, आपको किसी भूमिका के खिलाफ जांच करने के लिए current_user_can का उपयोग नहीं करना चाहिए

यह नोटिस विशेष रूप से has_capफ़ंक्शन के PHP प्रलेखन में जोड़ा जाता है जिसे कहा जाता हैcurrent_user_can

क्षमता के स्थान पर एक भूमिका के खिलाफ जाँच करते समय भाग में समर्थन किया जाता है, यह अभ्यास हतोत्साहित करता है क्योंकि यह अविश्वसनीय परिणाम दे सकता है।

ऐसा करने का सही तरीका उपयोगकर्ता को प्राप्त करना है और $user->rolesइस तरह जांचना है :

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ) {

        $user = get_userdata( get_current_user_id() );
        if( ! $user || ! $user->roles ){
            return false;
        }

        if( is_array( $role ) ){
            return array_intersect( $role, (array) $user->roles ) ? true : false;
        }

        return in_array( $role, (array) $user->roles );
    }
}

यहां कुछ हेल्पर फ़ंक्शंस हैं जो मैं ऐसा करने के लिए उपयोग करता हूं (जैसा कि कभी-कभी मैं केवल वर्तमान उपयोगकर्ता नहीं चाहता हूं):

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ){
        return user_has_role_by_user_id( get_current_user_id(), $role );
    }
}

if( ! function_exists( 'get_user_roles_by_user_id' ) ){
    function get_user_roles_by_user_id( $user_id ) {
        $user = get_userdata( $user_id );
        return empty( $user ) ? array() : $user->roles;
    }
}

if( ! function_exists( 'user_has_role_by_user_id' ) ){
    function user_has_role_by_user_id( $user_id, $role ) {

        $user_roles = get_user_roles_by_user_id( $user_id );

        if( is_array( $role ) ){
            return array_intersect( $role, $user_roles ) ? true : false;
        }

        return in_array( $role, $user_roles );
    }
}

तो आप बस यह कर सकते हैं:

current_user_has_role( 'editor' );

या

current_user_has_role( array( 'editor', 'administrator' ) );


-1
<?php if( current_user_can('editor')) :
  echo "welcome";
elseif( current_user_can('member')) :
  echo "welcome";
else :
 wp_die("<h2>To view this page you must first <a href='". wp_login_url(get_permalink()) ."' title='Login'>log in</a></h2>");
endif;
?>

1
यह बहुत अच्छा होगा यदि आप यह बता सकें कि यह ओपी की मदद कैसे करता है।
ब्रावोकील

आप केवल "संपादक" या "सदस्य" पृष्ठ को देखने की अनुमति दे सकते हैं, आप इस कोड को जेनेरिक-पेज.php में पोस्ट कर सकते हैं
seowmx

4
कृपया कोड ड्रॉप न करें। टिप्पणी और कुछ स्पष्टीकरण जोड़ें कि यह पूछने वालों की समस्या को कैसे हल करता है।
क्राफ्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.