अगर is_admin डैशबोर्ड है तो शॉर्टकोड रजिस्टर क्यों न करें?


10

मैंने देखा है कि कुछ प्लगइन्स जैसे कि कॉन्टैक्ट-फॉर्म -7 , नेक्स्टजेन-गैलरी , संभवतः अन्य, is_admin()सच होने पर अपने शॉर्टकोड को पंजीकृत नहीं करने की एक दिलचस्प विरोधी सुविधा है।

समस्याग्रस्त बात यह है, यदि आप अजाक्स से कुछ गतिशील सामग्री (जिसमें शोर्ट हो सकता है) उत्पन्न करना चाहते हैं, और इसे करने के "सही" wp तरीके का उपयोग करें, व्यवस्थापक-ajax.php, यह WP_MIN सच नहीं होना असंभव है। व्यवस्थापन की पहली पंक्तियाँ देखें-ajax.php:

define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
    define( 'WP_ADMIN', true );
}

अब, ऐसा लगता है कि PHP एक्सटेंशन हैं जो आपको एक परिभाषित स्थिरांक (हैकी) को अन-सेट करने देंगे, या अनिर्दिष्ट WP_Screen प्रणाली के साथ गड़बड़ $GLOBALS['current_screen']करने और is_admin()फ़ंक्शन को गलत बनाने के लिए एक तरीका हो सकता है ?? सबसे उपयोगी समाधान पृष्ठ या साइट रूट पर पोस्ट किया जा रहा है।

क्या is_admin()झूठी होने पर अपने शॉर्टकोड को पंजीकृत करना प्लगइन्स के लिए सामान्य है? यदि ऐसा है, तो मुझे इसके अलावा कोई अन्य दस्तावेज या कारण नहीं मिल सकता है क्योंकि यह समय से पहले का अनुकूलन हो सकता है।

जवाबों:


6

मैंने कुछ समय पहले संपर्क-प्रपत्र -7 के साथ इसी मुद्दे को देखा है।

लेकिन ध्यान दें कि शॉर्टकोड दर्ज is_adminकरना do_it_wrong पर आधारित है ( gmazzap का उत्तर देखें )

दो कारण हैं जो पहली नजर में वैध लगते हैं (और वे गलत क्यों हैं):

  1. (पूरी तरह से) प्लगइन लेखक ने स्क्रिप्ट को केवल शॉर्टकोड दर्ज करने के लिए अनुकूलित करने की कोशिश की, जब उन्हें ज़रूरत हो। इस मामले में लेखक ने यह नहीं माना कि अजाक्स अनुरोधों में शोर्ट का उपयोग किया जा सकता है।

    गलत क्योंकि : यह अनुकूलन कोई प्रदर्शन लाभ प्रदान नहीं करता है। यह केवल वैश्विक "पंजीकृत शॉर्टकोड" सरणी के लिए एक मूल्य जोड़ता है।

  2. (यह अधिक संभावना है) प्लगइन लेखक ने जानबूझकर Ajax अनुरोधों में शोर्ट के समर्थन को अक्षम कर दिया। संपर्क-प्रपत्र -7 के साथ यह संभवतः मामला है क्योंकि प्रपत्र "अजाक्स के माध्यम से सबमिट करें" पर सेट किए जा सकते हैं। हालाँकि, इस सुविधा के लिए अतिरिक्त जावास्क्रिप्ट फ़ाइलों को लोड करने के लिए फॉर्म की आवश्यकता होती है, जो तब लोड नहीं होते हैं जब शॉर्टकोड को अजाक्स के माध्यम से पार्स किया जाता है और जावास्क्रिप्ट को इसके माध्यम से जोड़ा जाता है enqueue_scripts()

    लेखक ने बग रिपोर्ट को रोकने के लिए अजाक्स समर्थन को अक्षम करने का फैसला किया जैसे "इसका उपयोग न करें: फॉर्म प्रदर्शित किया गया है लेकिन सबमिट बटन पर क्लिक करने से काम नहीं होता है। समय की पूरी बर्बादी!"

    इसलिए उपयोगकर्ता को या तो गारंटीड-वर्किंग फॉर्म दिखाई देगा या कोई फॉर्म नहीं होगा।

    गलत क्योंकि : is_adminयहाँ के लिए जाँच बुरा अभ्यास है। कॉन्डिटॉन को यह जांचना चाहिए कि क्या स्थिरांक DOING_AJAXपरिभाषित और सत्य है।

हालांकि अधिकांश प्लगइन्स इस तरह की स्थिति का उपयोग नहीं करते हैं, लेकिन कुछ लोगों के पास यह प्रतिबंध संभवतः अतीत में समस्याओं के कारण है।

जब शोर्ट केवल पृष्ठ पर कुछ आउटपुट कर रहा है तो कोई भी व्यवस्थापक-शर्त जोड़ने का कोई कारण नहीं है। हालाँकि, जब शोर्ट js या jss cssue फ़ाइलों को भी करता है तो यह उपयोग को गैर-व्यवस्थापक / गैर-अजाक्स अनुरोधों तक सीमित करने के लिए समझ में आता है।


2
शॉर्टकोड पंजीकृत नहीं होने से प्रदर्शन में शून्य प्रभाव के करीब है। पंजीकरण केवल एक सरणी में एक चर जोड़ता है। क्या है संभवतः धीमी गति से यह रजिस्टर करने के लिए नहीं शोर्ट प्रदर्शन करने के लिए, है। तो अगर यह एक प्रदर्शन आशावादी है, तो यह एक असफल है। यदि प्लगइन लेखक ajax के लिए शोर्ट को निष्क्रिय करना चाहता है, is_adminतो a_ax_wrong के लिए जाँच करना ajax अनुरोधों की जाँच करने के लिए WP में बेहतर तरीके हैं। अंत में, यदि प्लगइन js / css को इनेबल करता है, अगर वह इसे अच्छी तरह से करता है ( 'wp_enqueue_scripts'एक्शन का उपयोग करके ) तो यह एडमिन पेज को प्रभावित नहीं करेगा क्योंकि उस हुक को एडमिन पेजों में निकाल नहीं दिया जाता है।
gmazzap

@gmazzap प्रतिक्रिया के लिए धन्यवाद, मैं पूरी तरह से सहमत हूँ! मैंने अपना उत्तर अपडेट कर दिया है और यह स्पष्ट करने के लिए आपके इनपुट को जोड़ दिया है कि स्थिति एक खराब अभ्यास है।
फिलिप

मुझे नहीं लगता कि # 2 की संभावना है, क्योंकि enqueue_scripts the_contentकॉल और व्यवस्थापक-AJAX कॉल को प्रभावित नहीं करना चाहिए ।
NoBugs

3

दरअसल, एडमिन पर शॉर्टकोड रजिस्टर नहीं करने का कोई कारण नहीं है।

यदि प्लग इन लेखक अजाक्स को निष्क्रिय करना चाहते हैं तो उन्हें करना चाहिए

if (defined('DOING_AJAX') && DOING_AJAX)

के बजाय जाँच के लिए व्यवस्थापक है।

ध्यान दें कि भविष्य में, यह संभव है कि शॉर्टकेक को कोर में एम्बेड किया जाएगा क्योंकि यह "फ़ीचर प्लगिन" है।

यदि ऐसा होगा, तो इसके साथ काम नहीं करेगा। यह आपको एक और पुष्टि देता है कि व्यवस्थापक पर शॉर्टकोड दर्ज न करने का कोई कारण नहीं है: यहां तक ​​कि कोर डेवलपर्स उन चीजों पर काम कर रहे हैं जिनके लिए व्यवस्थापक पर उपलब्ध शॉर्टकोड की आवश्यकता होती है

उन्होंने कहा, आपको संभावनाएं हैं:

  1. प्लगइन्स लेखक से संपर्क करें और देखें कि क्या वे उस व्यवहार को ठीक कर सकते हैं
  2. अपने आप से एक समाधान खोजने की कोशिश करें

# 2 के बारे में, वास्तव में पुस्तकालय मौजूद हैं जो is_adminसच होने के लिए मजबूर कर सकते हैं । वे हैक कर रहे हैं, और मैं उत्पादन में उन का उपयोग कभी नहीं होगा।

एक उदाहरण पैचवर्क है

इसका उपयोग करके आप किसी भी PHP कस्टम फ़ंक्शन को ओवरराइड कर सकते हैं।

एक में एमयू प्लगइन आप (पूरी तरह से untested) कर सकते हैं:

add_action('muplugins_loaded', function() {
  if ( defined('DOING_AJAX') && DOING_AJAX ) {
     require 'path/to/Patchwork.php';
     Patchwork\replace("is_admin", function() {
        return FALSE;
     });
  }
});

यह is_admin()अजाक्स अनुरोध पर रिटर्न को गलत बना देगा ।

हालांकि, जैसा कि कहा गया है, यह बहुत हैकिश है, और अप्रत्याशित प्रभावों के साथ अन्य प्लगइन्स (और कोर) व्यवहार को प्रभावित करेगा।

एक और बात आप कर सकते हैं व्यवस्थापक अनुरोध पर प्लगइन शोर्ट हैंडलर रजिस्टर करने के लिए है।

जैसे यदि प्लगइन कोड है:

if (! is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

फिर आप एक और प्लगइन लिख सकते हैं जो करता है:

if (is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

इस तरह दोनों मामलों में शोर्ट जोड़ी जाएगी।

यह अन्य प्लगइन कोड के आधार पर अकेले काम कर सकता है या नहीं, लेकिन इसका कोई सामान्य जवाब नहीं है।


आप भी कर सकते हैं add_shortcode('shortcode', array('their-class', 'their-function') )या समान।
NoBugs

:) निश्चित रूप से @nobugs
gmazzap

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