add_role () केवल एक बार चलते हैं?


11

मुझे यह जानकर आश्चर्य हुआ कि add_role () डेटाबेस को संशोधित करता है और विफल रहता है यदि भूमिका पहले से मौजूद है। यहां दो निहितार्थ हैं, एक दूसरे से अधिक गंभीर: 1) यदि आप विकास में हैं और अपने ऐड_ल कोड को अपडेट करते हैं, तो आपके पास सही होने पर पहले आपको__ल (2) हटाना होगा, आपको उस कोड को कभी नहीं चलाना चाहिए फिर।

इसलिए आम तौर पर मैं एक wp_loaded एक्शन हुक के अंदर अपना add_role () डाल रहा हूं। और जब से मैं विकास में हूँ, मैंने अपने add_role से पहले एक remove_role () भी जोड़ा है ताकि मुझे यकीन हो सके कि अगर मैं अपनी कैप्स की सूची को संशोधित करता हूं, तो यह वास्तव में प्रभावी होगा।

लेकिन स्पष्ट रूप से यह अब हर बार चलाया जा रहा है जब ब्लॉग का एक पृष्ठ एक्सेस किया जा रहा है। ठीक है, मैं इसे केवल-व्यवस्थापक कार्रवाई में रख सकता हूं, या मैं शायद उपयोगकर्ता या उपकरण के तहत एक प्लगइन पृष्ठ बना सकता हूं जहां यह भूमिका एक बार बनाई जा सकती है। मुझे लगता है मैं उम्मीद कर रहा हूँ कि वहाँ एक सरल, अधिक सुंदर समाधान है।

मुझे नहीं लगता कि वहाँ एक run_once कार्रवाई है?

या केवल भूमिका जोड़ने के लिए सबसे अच्छा अभ्यास है और फिर कई बार add_cap () का उपयोग करें? और फिर भी मुझे लगता है कि add_cap db तक पहुँच रहा है।

अनावश्यक डीबी पहुँच को कम करने के सर्वोत्तम तरीके के बारे में सोच रहा है। आपके सबसे अच्छे अभ्यास क्या हैं?


बहुत बढ़िया! इस सवाल के लिए धन्यवाद..बस जोड़ने remove_role()से पहले add_role()मुझे मदद की।
beytarovski

जवाबों:


10

उपयोगकर्ता की भूमिकाएँ और क्षमताएं डेटाबेस में सहेजी जाती हैं, इसलिए एक बार जब आपने add_role()इसका उपयोग कर लिया है और तब अगले लोड वर्डप्रेस को पता चलेगा कि भूमिकाएँ बिलकुल अंतर्निहित भूमिकाओं की तरह हैं।

अब यदि आप फ़ंक्शन को add_role()विशेष रूप से लाइन 141 पर देखते हैं, तो आप देखेंगे कि यह केवल डेटाबेस में भूमिका और क्षमताओं को बचाता है यदि संस्करण $use_dbसही है (जो वह डिफ़ॉल्ट रूप से सेट है) तो आप कॉल करने से पहले बस इसे बदल सकते हैं add_role()फ़ंक्शन और भूमिका सहेजी नहीं जाएगी।

प्रयत्न:

//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );

अपडेट करें:

यदि इसका परीक्षण / विकास के माहौल में है, तो मुझे कोई नकारात्मक पहलू नहीं दिखता है, लेकिन यदि आप एक जीवित वातावरण में हैं, तो आप हर लोड पर भूमिका बनाने के लिए समय बचाते हैं।

जैसा कि एक बार चलने वाले सर्वोत्तम अभ्यास के लिए होता है, यदि एक प्लगइन में आपको उपयोग करना चाहिए register_activation_hookऔर किसी अन्य चीज के लिए मैं एक साधारण कस्टम मेड सशर्त फ़ंक्शन का उपयोग करता हूं:

function run_once($key){
    $test_case = get_option('run_once');
    if (isset($test_case[$key]) && $test_case[$key]){
        return false;
    }else{
        $test_case[$key] = true;
        update_option('run_once',$test_case);
        return true;
    }
}

**usage:**
if (run_once('add_user_role')){
    //do you stuff and it will only run once
}

अ छ बकवास है। मैं भी WP_Roles वर्ग के बारे में कुछ पुराने rooting से इस बारे में जानता था। क्या आप भूमिकाओं के लिए डेटाबेस का उपयोग नहीं करने के लिए किसी भी नकारात्मक सोच सकते हैं? और क्या केवल एक बार कुछ करने के लिए WP सर्वोत्तम अभ्यास है?
टॉम ऑस्टर

अपडेट के लिए धन्यवाद - मुझे update_option समाधान की सादगी पसंद है
टॉम ऑगस्टर

वास्तव में संतोषजनक नहीं लेकिन यह सबसे अच्छा समाधान लगता है
22

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