wp_localize_script पर ऑब्जेक्ट / JSON पास करें


15

मुझे जावास्क्रिप्ट का एक काम करने वाला टुकड़ा मिला है जिसमें एक वस्तु शाब्दिक है। लेकिन मुझे इसे स्थानीय बनाने की आवश्यकता है, और मैं यह पता लगाने के लिए ytrying कर रहा हूं कि इसे कैसे फिर से लिखना है ताकि मैं इसे प्राप्त करने के लिए wp_localize_script () प्राप्त कर सकूं और सही प्रारूप का उत्पादन कर सकूं।

गैर-स्थानीयकृत (गैर गतिशील) संस्करण इस तरह दिखता है:

var layoyt_config = {
    'header'        : 1 
,   'footer'        : 1
,   'ls'            : {'sb1':1}
,   'rs'            : {'sb1':1,'sb2':1}
,   'align'         : 'center'
};  

अब, उन मूल्यों को php (कुछ wp_settings के आधार पर) से उत्पन्न करने के लिए मैं wp_localize_script का उपयोग करना चाहता हूं, इसलिए मैं इसे वहां से ले जा सकता हूं:

var layoyt_config = my_localized_data.layoyt_config;

और उस डेटा को उस ऑब्जेक्ट प्रॉपर्टी में प्राप्त करने के लिए मैंने सोचा था कि मैं ऐसा कर सकता हूं, लेकिन स्पष्ट रूप से नहीं:

$data = array(
    'layout_config' => {
        'header' : 1
    ,   'footer' : 1
    ,   'ls' : {'sb1': 1}
    ,    'rs' : {'sb1': 1,'sb2': 1}
    ,    'align' : 'center'
    }
);
wp_localize_script('my-script-handle', 'my_localized_data', $data);

चूंकि यह PHP पार्स त्रुटि का कारण बनेगा, इसलिए मैंने सरणी सिंटैक्स में जसन को फिर से लिखने की कोशिश की है, क्योंकि wp_localize_script उस बैक को ऑब्जेक्ट नोटेशन में बदल देगा, लेकिन यह भी मेरे लिए काम नहीं करता है:

$data = array(
    'layout_config' => array(
        'header' => 1
    ,   'footer' => 1
    ,   'ls' => array('sb1'=>1)
    ,    'rs' => array('sb1'=>1,'sb2'=>1)
    ,    'align' => 'center'
    )
);
wp_localize_script('my-script-handle', 'my_localized_data', $data);

और जब यह सुचारू रूप से php parser चलाता है, तो मुझे मेरे पृष्ठ स्रोत में अपेक्षित आउटपुट नहीं मिलता है, क्योंकि my_localized_data.layout_config एक स्ट्रिंग "एरे" बन जाता है, यहाँ आउटपुट है:

<script type='text/javascript'>
    /* <![CDATA[ */
    var wpkit_localized_data = {
    layout_config: "Array"
    };
    /* ]]> */
</script>

तो .. मैं यह कैसे कर सकता हूं (या मुझे बस यह स्वीकार करना होगा कि मुझे अपनी वस्तु को 'असतत चर' में 'समतल' करना होगा:

lc_header = '1';
ls_ls_sb1 = '1';
etc...

जवाबों:


15

वास्तव में, wp_localize_script()यह सरल है , यह सिर्फ मूल्यों के चारों ओर उद्धरण जोड़ता है और सामग्री से बच जाता है, जिससे सभी को तार होने की उम्मीद है।

हालांकि, l10n_print_afterऐरे की कुंजी है, जो बिना किसी हस्तक्षेप के मुद्रित किया जाएगा। इसका उपयोग स्ट्रिंग्स पास होने के बाद मनमाने कोड को निष्पादित करने के लिए किया जा सकता है। अपने अतिरिक्त डेटा को पास करने के लिए आप इसका उपयोग कर सकते हैं।

$data = array(
    'layout_config' => {
      'ls' : {'sb1': 1}
    }
);
$reshuffled_data = array(
    'l10n_print_after' => 'my_localized_data = ' . json_encode( $data ) . ';'
);
wp_localize_script('my-script-handle', 'my_localized_data', $reshuffled_data);

आप इस तरह से कोड को समाप्त करेंगे:

var my_localized_data = {}; // What is left of your array
my_localized_data = {'layout_config': {'ls': {'sb1': 1}}}; // From l10n_print_after

बहुत उपयोगी है, हालांकि मुझे लगता है कि आपको json_encode के बाद एक अर्ध-बृहदान्त्र का मतलब था, अल्पविराम नहीं, क्या मैं सही हूं?
kovshenin

1
@ कोवशेनिन: अच्छी पकड़! मैंने इसे ठीक किया, लेकिन अगर आपने इसे एक संपादन के रूप में प्रस्तावित किया होता तो आपको इसके लिए +2 प्रतिनिधि मिल जाता।
जन फैब्री

इस प्रश्न को हाईजैक करने का मतलब नहीं है, लेकिन wordpress.stackexchange.com/questions/53842 (यदि किसी के यहाँ कोई संकेत है) के लिए देखने के लिए एक संदर्भ के रूप में यह प्रश्न / उत्तर दिया गया था । धन्यवाद!
जाच

1

अस्वीकरण - मैं यहाँ जेएस सुरक्षा सामान पर अपनी गहराई से बाहर हूँ।

सबसे पहले, अपने इच्छित आउटपुट से मिलान करने के लिए आप नेस्टिंग स्तर से दूर हैं। ऑब्जेक्ट नाम स्थानीय कॉल में पैरामीटर के रूप में जाता है (सरणी कुंजी के बजाय):

$data = array(
        'header' => 1
    ,   'footer' => 1
    ,   'ls' => array('sb1'=>1)
    ,    'rs' => array('sb1'=>1,'sb2'=>1)
    ,    'align' => 'center'
);
wp_localize_script('my-script-handle', 'layout_config', $data);

लेकिन lsऔर rsअभी भी टूटे हुए हैं क्योंकि WP_Scripts->print_scripts_l10n()वेरिएबल ऐरे होने पर मेथड केस को हैंडल नहीं करता है।

सर्वश्रेष्ठ मैं ठीक करने के लिए आ सकता है जो निम्नलिखित फिल्टर है (ऊपर - यकीन नहीं कि उत्पादन में इसका उपयोग कितना सुरक्षित होगा, लेकिन सामान्य विचार देने के लिए):

add_filter('js_escape','js_escape_nested', 10, 2);

function js_escape_nested($safe_text, $text) {

     if(is_array($text) )
         return str_replace( '"', "'", json_encode ($text) );

     return $safe_text;
}

मैं समझता हूं कि मुख्य ऑब्जेक्ट नाम wd_localize_script के लिए कॉल में 2dn पैरामीटर के रूप में जाता है, लेकिन, मैं पहले से ही ऐसा करता हूं, मेरे स्थानीयकृत ऑब्जेक्ट का नाम 'my_localized_data' माना जाता है, उस ऑब्जेक्ट में कई गुण होंगे। सादे स्ट्रिंग मान, लेकिन मुझे इन गुणों में से एक की आवश्यकता है एक बहुआयामी वस्तु।
मिकेलब्रम

यह संशोधन के बिना wp_localize_script के दायरे से बाहर लगता है। यह बहुआयामी सरणियों को संभाल नहीं सकता है। मैं अब एक अलग विधि के साथ आया हूं, जहां मैं अपने स्थानीय रूप से बहु-आयामी ओब्जेक्ट को एक html डेटा- * मान के रूप में संग्रहीत करता हूं। यह ठीक काम करता है, लेकिन अतिरिक्त प्रश्न छोड़ें: wordpress.stackexchange.com/questions/8684
mikkelbreum
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.