Current_user_can () और संबंधित कार्यों का उपयोग करने का वैध समय क्या है?


10

वेनिला WP कोर लोड के दौरान वर्तमान उपयोगकर्ता सेट किया जा रहा है $wp-init()जिसमें थीम लोड के बाद और initहुक से पहले है । यह कार्यक्षमता के अच्छे अभ्यास के अनुरूप है, जो initबाद में या उससे कम हो जाता है।

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

दस्तावेज़ीकरण इस अभ्यास के लिए या उसके खिलाफ कोई दावा नहीं करता है (जो मुझे मिल सकता है)।

हालांकि कुछ प्लगइन्स उपयोगकर्ता-संबंधित कार्यक्षमता में हुक करने लगते हैं और initहर समय पोस्ट- स्टेट की अपेक्षा करते हैं ।

उदाहरण के लिए bbPress नोटिस के बाद फेंकता है:

// If the current user is being setup before the "init" action has fired,
// strange (and difficult to debug) role/capability issues will occur.
if ( ! did_action( 'after_setup_theme' ) ) {
    _doing_it_wrong( __FUNCTION__, __( 'The current user is being initialized without using $wp->init().', 'bbpress' ), '2.3' );
}

त्वरित प्रदर्शन के लिए इसे कोर की परिभाषा में फेंक दें current_user_can():

function current_user_can( $capability ) {

    if ( ! did_action('after_setup_theme') ) {
        echo wp_debug_backtrace_summary();
    }

इस स्थिति में "सही" कौन है? क्या उपयोगकर्ता-संबंधी कार्यों के पहले अनुमति / निषिद्ध उपयोग के बारे में एक विहित निर्धारण है init?


जवाबों:


7

के लिए एकमात्र शर्त current_user_can()एक मौजूदा है wp_get_current_user()। उत्तरार्द्ध में परिभाषित किया गया है pluggable.php, इसलिए आप इसे बाद में उपयोग कर सकते हैं plugins_loaded

_doing_it_wrong()आप अपने प्रश्न में जिस कॉल का हवाला दे रहे हैं, वह स्वयं गलत है। मेरा अनुमान है कि आपने बड्डीप्रेस या बीबप्रेस से लिया है। यदि वे लंबे समय तक प्रतीक्षा नहीं करते हैं तो दोनों एक पुनरावृत्ति में चल रहे हैं। पुनरावृत्ति को रोकने के अन्य, बेहतर तरीके हैं।

कुछ मामलों में, जैसे स्थान बदलने के लिए, आप है उपयोग करने के लिए वर्तमान उपयोगकर्ता वस्तु पहले, तो के लिए इंतज़ार कर after_setup_themeभी एक विकल्प नहीं है।



2

यदि आप उपयोगकर्ता क्षमता की जांच करते हैं, तोinit इसका मतलब है कि संभावना है कि आप वर्तमान उपयोगकर्ता ऑब्जेक्ट की सेटिंग के लिए जिम्मेदार हैं।

यदि आप उपयोगकर्ता को बाद में एक्सेस initकरते हैं, तो आप सुनिश्चित हैं कि उपयोगकर्ता पहले से ही कुछ और सेटअप कर रहा है, अधिकांश समय स्वयं कोर।

यही कारण है कि उपयोगकर्ता तक पहुँचने के बाद है initमाना जाता है सुरक्षित

वास्तव में, प्रारंभिक पहुंच संभवतः चल रहे कुछ फ़िल्टर को तोड़ सकती है determine_current_user

यह कहने योग्य है कि एक "नाजुक" हुक है, क्योंकि संभावना है कि यह कभी नहीं चलता है, केवल प्लग करने योग्य कार्यों में निकाल दिया जाता है।

हालांकि, ऐसे मामले हैं (जैसे @toscho ने कहा) जहां आप इनिट तक इंतजार नहीं कर सकते , उन मामलों में आपके पास कोई विकल्प नहीं है।

किसी भी असंगति को हल करने का एकमात्र तरीका मामला है, यदि आपके पास है।

एक समाधान जो ज्यादातर मामलों में काम कर सकता है (जिसमें bbPress / BuddyPress शामिल है) इसके बजाय निम्नलिखित फ़ंक्शन का उपयोग करना है current_user_can:

function compat_current_user_can( $capability )
{
  if ( did_action( 'init' ) ) {
     return current_user_can( $capability );
  }

  $user_id = apply_filters( 'determine_current_user', false );

  return user_can( $user_id, $capability );
}

यह वैश्विक उपयोगकर्ता की स्थापना के बिना वर्तमान उपयोगकर्ता क्षमता को जल्दी से जांचने की अनुमति देता है, इसलिए सिद्धांत रूप से पहले सुरक्षित होना चाहिए init

समस्या यह है कि जैसा कि ऊपर कहा गया है, कोई भी कोड जो प्लग करने योग्य कार्यों को ओवरराइड करता है और न कि आग determine_current_userइसे तोड़ता है।


मुझे लगता है कि आपके फंक्शन में वेरिएबल टैड गड़बड़ है। :)
दुर्लभ

हां ... रात के खाने से पहले बहुत तेज टाइपिंग: पी धन्यवाद @ialocin फिक्सिंग के लिए।
gmazzap

इसका उल्लेख न करें। इसके अलावा सिर्फ यह मत बताइए कि क्या गलत है, इसे ठीक करें @Rarst :)
निकोलई

1

मुझे लगता है कि BuddyPress और bbPress _doing_it_wrongसंदेश जारी करने से पहले कुछ और जाँच की जानी चाहिए करने के लिए इच्छुक है

मैंने $ current_user की वास्तविक सेटिंग की जाँच करने के लिए दोनों रूटीन को बदल दिया।

global $current_user; 
if ( is_null( $current_user ) ) {
    _doing_it_wrong( ... );
}

नोटिस अब प्रदर्शित नहीं किए गए थे।

did_action( "after_setup_theme" )बेल्ट के साथ जाने के लिए परीक्षण ब्रेसिज़ बन जाता है।

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