current_shortcode () - वर्तमान में प्रयुक्त शोर्ट का पता लगाएं


11

एक प्लगइन वर्ग में मैं सार्वजनिक डेटा के लिए सरल क्षेत्र प्रदान करना चाहता हूं: ईमेल, फोन नंबर, ट्विटर आदि। सूची को बढ़ाया जा सकता है।

देखें प्लगइन लोक संपर्क डेटा जानकारी के लिए GitHub पर।

उपयोग को सरल रखने के लिए, मैं उन शॉर्टकोड की भी पेशकश करना चाहता हूं जो टाइप करने में आसान हैं:

  • [public_email]
  • [public_phone]
  • [public_something]

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

foreach ( $this->fields as $key => $value )
{
    add_shortcode( 'public_' . $key, array( $this, 'shortcode_handler' ) );
}

अब shortcode_handler()जानना होगा कि किस शोर्ट को कहा गया है। मेरा सवाल है: मैं यह कैसे करूँ?

मेरा वर्तमान समाधान एक और कार्य है:

protected function current_shortcode()
{
    $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS );
    return $backtrace[3]['args'][0][2];
}

यह… के लिए काम करता है the_content()। लेकिन यह न तो सुरुचिपूर्ण है और न ही मजबूत।
मैंने पढ़ा है wp-includes/shortcodes.php, लेकिन मैं अभी नहीं देख सकता कि इसे बेहतर कैसे किया जाए।


1
मेरे पास अब आप सब उत्सुक हैं। मैं जल्द ही इस पर गौर करूंगा। मुझे पता है कि शॉर्टकोड.php केवल फ़ंक्शंस का एक गुच्छा है, अगर इसे OOP का उपयोग करके सही ढंग से लिखा गया था, तो इसमें कोई संदेह नहीं होगा कि इसमें एक current_shortcode वर्ग चर है और इससे सब कुछ आसान हो गया है। मेरी जानकारी के लिए Wordpress केवल एक सरणी में सभी शॉर्टकोड और कॉलबैक को संग्रहीत करता है, मुझे आश्चर्य है कि क्या यह एक शॉर्टकोड को एक चर में स्टोर करने का एक तरीका है, क्योंकि यह संसाधित है और कोर फ़ाइलों को हैक किए बिना?
ड्वेन चारिंगटन

@toscho सहमत, मुझे लगता है कि वास्तव में एक समस्या है, शॉर्टकोड किए जाने के तरीके में एक रीमॉडेलिंग, (विजेट्स की तरह अधिक ओओपी को गले लगाने) को ध्यान में रखना चाहिए। मैं उस पर मदद करना पसंद करूंगा, और बाद में इसे कोर के अपडेट के रूप में भेजूंगा।
वेबर

@brasofilo ठीक है, मैंने अभी किया है।
FUXIA

जवाबों:


3

यह अप्रयुक्त है , लेकिन कॉलबैक फ़ंक्शन को तर्कों की एक सरणी के साथ प्रदान किया जाता है, $argsजो शॉर्टकोड के साथ प्रदान किए गए पैरामेट्स देता है (यदि कोई हो)। शून्य प्रविष्टि में कभी-कभी उपयोग किए जाने वाले शोर्ट का नाम होता है (जैसे public_email)। कभी-कभी मेरा मतलब है ...

विशेषताएँ सरणी ($ atts [0]) की शून्य प्रविष्टि में वह स्ट्रिंग होगी जो शोर्टकोड रेगेक्स से मेल खाती है, लेकिन केवल यदि कॉलबैक नाम से अलग है, जो अन्यथा कॉलबैक फ़ंक्शन के तीसरे तर्क के रूप में प्रकट होता है।

( कोडेक्स देखें )। अपने उद्देश्यों के लिए $atts[0]या तो शामिल होंगे public_email, public_phoneआदि।

function shortcode_handler($atts,$content=NULL){
     if(!isset($atts[0]))
         return; //error?

     switch($atts[0]):
         case 'public_email':
              //deal with this case
              break;
         case 'public_phone':
              //deal with this case
              break;
         case 'public_something':
              //deal with this case
              break;
     endswitch;   
}

आह, मुझे याद है, मैं एक लंबे समय से पहले कुछ इसी तरह से भाग रहा हूं। मेरे मामले में यह शोर्ट हैंडलर के लिए तीसरा तर्क है। पहला है $args, दूसरा $contentऔर आखिरी वाला शोर्ट!
FUXIA

वास्तव में? शोर्ट कॉल कॉलबैक नाम 'शोर्ट_हैंडलर' से अलग है ... मुझे लगा होगा कि इसमें दिया गया होगा $args। लेकिन अगर वह आपके लिए काम करता है ...: डी।
स्टीफन हैरिस

2

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

/**
 * Handler for all shortcodes.
 *
 * @param  array  $args
 * @param  NULL   $content Not used.
 * @param  string $shortcode Name of the current shortcode.
 * @return string
 */
public function shortcode_handler(  $args = array (), $content = NULL, $shortcode = '' )
{
    $key = $this->current_shortcode_key( $shortcode );
    $args['print'] = FALSE;
    return $this->action_handler( $key, $args );
}

/**
 * Returns the currently used shortcode. Sometimes.
 *
 * @return string
 */
protected function current_shortcode_key( $shortcode )
{
    return substr( $shortcode, 7 );
}

इसे मेरे प्रश्न से जुड़े प्लगइन में कार्रवाई में देखें।

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