क्या 3 दलों को $ wp_scripts / $ wp_styles-> add_data का उपयोग करना चाहिए?


31

WP_Dependenciesकक्षा के भीतर नाम की एक विधि मौजूद है add_data। यह फ़ंक्शन उन स्क्रिप्ट / शैलियों में डेटा जोड़ता है जिन्हें वर्डप्रेस लोड के दौरान एन्क्यूट किया गया है। इस फ़ंक्शन के लिए एक सामान्य रूप से उद्धृत उपयोग आईई के विभिन्न संस्करणों में लक्षित स्टाइलशीट्स को जोड़ने पर एक सशर्त जोड़ने के लिए है। उदाहरण के लिए, IE8 और निम्न को लक्षित करने के लिए:

function test_wp_print_styles() {
    global $wp_styles;

    wp_enqueue_style( 'test-style', get_template_directory_uri() . '/css/test.css', array(), 1, 'all' );
    $wp_styles->add_data( 'test-style', 'conditional', 'lte ie8' );
}
add_action( 'wp_print_styles', 'test_wp_print_styles' );

यह इस प्रकार प्रस्तुत करेगा:

<!--[if lte ie8]>
<link rel='stylesheet' id='test-style-css'  href='http://trunkosaurus.dev/wp-content/themes/twentyeleven/css/test.css?ver=1' type='text/css' media='all' />
<![endif]--> 

जब मैं कोर के माध्यम से देखता हूं, तो मैं उन मुट्ठी भर स्थानों को देखता हूं जहां इस पद्धति का उपयोग किया जाता है:

  • WP_Styles->add_inline_style(): संदर्भित स्टाइलशीट के माध्यम से इनलाइन शैली जोड़ता है (द्वारा किया गया WP_Styles->print_inline_style())

  • WP_Scripts->localize(): एक जसन एन्कोडेड ऑब्जेक्ट जोड़ता है (अधिक "सार्वजनिक" wp_localize_script()फ़ंक्शन द्वारा लिपटा )

  • wp_plupload_default_settings() : 'wp-plupload' स्क्रिप्ट के लिए json एनकोडेड ऑब्जेक्ट (एक बहुआयामी सरणी से बनाया गया) जोड़ता है (ध्यान दें कि यह 3.4 में आगामी है)

  • स्क्रिप्ट और शैलियों का पंजीकरण / एनक्यूइंग करते समय डिफ़ॉल्ट स्क्रिप्ट के लिए डेटा जोड़ना ( wp-includes/script-loader.php)

विधि के उपयोग के माध्यम से पढ़ने से, यह एक विशिष्ट उपयोग के मामले में प्रकट नहीं होता है। में wp_plupload_default_settings, यह मनमाना डेटा इंजेक्शन के लिए अनुमति देता है। इसमें wp_register_script, हेडर और फुटर स्क्रिप्ट के बीच अंतर करने के लिए इसका उपयोग किया जाता है। में add_inline_style, यह इनलाइन शैली उसके बाद एक निर्धारित स्टाइलशीट कतारबद्ध है जोड़ा जाना चाहिए निरूपित किया जाता है।

इस फ़ंक्शन के लिए एक उत्कृष्ट उपयोग निम्नलिखित कोड की तरह कुछ होगा जहां आप एक बाहरी स्क्रिप्ट की व्याख्या कर रहे हैं, लेकिन इसे कुछ कॉन्फ़िगरेशन संस्करण भेजने की आवश्यकता है, जिनमें से कुछ डीबी से आते हैं:

function zdt_enqueue_add_this() {
    global $wp_scripts;

    wp_enqueue_script( 'zdt-add-this', 'http://s7.addthis.com/js/250/addthis_widget.js#pubid=myidhere' );

    // Contrived example of database call to get a twitter handle stored in the db
    $author_twitter_handle = zdt_get_twitter_handle();

    $js = "var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @" . sanitize_key( $author_twitter_handle ) . "' } };\n";
    $js .= 'var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };';

    $wp_scripts->add_data( 'zdt-add-this', 'data', $js );
}
add_action( 'wp_enqueue_scripts', 'zdt_enqueue_add_this' );

यह परिणाम होगा:

<script type='text/javascript'>
/* <![CDATA[ */
var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @tollmanz' } };
var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };
/* ]]> */
</script>
<script type='text/javascript' src='http://s7.addthis.com/js/250/addthis_widget.js?ver=3.4-beta4-20731#pubid=myidhere'></script>

ध्यान दें कि इसे पूरा नहीं किया जा सकता है wp_localize_scriptक्योंकि addthis_shareऑब्जेक्ट में गुण हैं ( मैंने पहले इस बारे में कुछ हद तक हैक किया था )।

संपादित करें: मैं इसे बताते हुए गलत था। wp_localize_scriptबहुआयामी सरणियों को ठीक से संभालता है।

यह विधि निम्नलिखित कारणों से वास्तव में अच्छी तरह से काम करती है:

  1. यह आपको स्क्रिप्ट हैंडल से डेटा संलग्न करने की अनुमति देता है ताकि यह हमेशा स्क्रिप्ट के साथ ठीक से संलग्न हो। इसके अलावा, यह स्क्रिप्ट, स्क्रिप्ट ऑर्डर और स्क्रिप्ट प्लेसमेंट को समाप्त करने के बारे में बुद्धिमान होगा।
  2. यह आपको JS में var भेजने के लिए PHP का उपयोग करने की अनुमति देता है।
  3. यह wp_print_stylesकुछ मनमानी स्क्रिप्ट को प्रिंट करने के लिए उपयोग करने से अधिक व्यवस्थित लगता है जो बाद में एक लिपिबद्ध स्क्रिप्ट द्वारा कार्य किया जाता है।

कुछ चीजें हैं जो उम्मीद के मुताबिक काम नहीं करती हैं जो मुझे इस पद्धति के बारे में चिंतित करती हैं। ऐसा ही एक मुद्दा यह है कि यदि आप wp_localize_scriptसाथ में उपयोग करते हैं $wp_scripts->add_data, तो आप अप्रत्याशित परिणाम प्राप्त कर सकते हैं। उदाहरण के लिए:

// Contrived example of database call to get a twitter handle stored in the db
$author_twitter_handle = zdt_get_twitter_handle();

$js = "var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @" . sanitize_key( $author_twitter_handle ) . "' } };\n";
$js .= 'var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };';

$wp_scripts->add_data( 'zdt-add-this', 'data', $js );
wp_localize_script( 'zdt-add-this', 'addthis_share', array( 'var' => 'val' ) );

पैदा करता है:

<script type='text/javascript'>
/* <![CDATA[ */
var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @tollmanz' } };
var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };
var addthis_share = {"var":"val"};
/* ]]> */
</script>
<script type='text/javascript' src='http://s7.addthis.com/js/250/addthis_widget.js?ver=3.4-beta4-20731#pubid=myidhere'></script>

जबकि यह स्क्रिप्ट:

// Contrived example of database call to get a twitter handle stored in the db
$author_twitter_handle = zdt_get_twitter_handle();

$js = "var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @" . sanitize_key( $author_twitter_handle ) . "' } };\n";
$js .= 'var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };';

wp_localize_script( 'zdt-add-this', 'addthis_share', array( 'var' => 'val' ) );
$wp_scripts->add_data( 'zdt-add-this', 'data', $js );

पैदा करता है:

<script type='text/javascript'>
/* <![CDATA[ */
var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @tollmanz' } };
var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };
/* ]]> */
</script>
<script type='text/javascript' src='http://s7.addthis.com/js/250/addthis_widget.js?ver=3.4-beta4-20731#pubid=myidhere'></script>

इसके dataद्वारा सेट की गई कुंजी wp_localize_scriptको अंततः कॉल द्वारा अधिलेखित कर दिया जाता है $wp_scripts->add_data, जबकि यदि आप wp_localize_scriptएक ही स्क्रिप्ट के लिए दो बार कॉल करते हैं, तो स्ट्रिंग ठीक से समतल हो जाएगी।

जबकि यह सब एक लिपिबद्ध स्क्रिप्ट के साथ उपयोग के लिए मनमानी स्क्रिप्ट को प्रिंट करने का एक बहुत आसान तरीका है, यह मुझे लगता है कि संघर्षों की क्षमता के कारण इसका व्यापक रूप से उपयोग नहीं किया जाना चाहिए। मैं निश्चित रूप से व्यक्तिगत परियोजनाओं में इसका उपयोग करने के लिए एक तर्क देख सकता हूं जहां कोड का उपयोग सामुदायिक प्लगइन्स / थीम में नहीं किया जाएगा।

मैंने यह देखने के लिए कोर ट्रेक को देखा कि क्या फ़ंक्शन के उद्देश्य के रूप में कोई सुराग था। मुझे एक टिकट मिला (http://core.trac.wordpress.org/ticket/11520) (उस पर एक महाकाव्य) जिसने मनमाने ढंग से जेएस को जोड़ने के अन्य तरीकों की खोज की। इसलिए ऐसा लगता है कि जेएस को जोड़ने के लिए एक बेहतर तरीका बनाने में रुचि है, लेकिन निश्चित रूप से नहीं अगर add_dataप्रक्रिया का हिस्सा होना चाहिए।

मेरा मुख्य प्रश्न है: क्या डेवलपर्स को इस फ़ंक्शन का उपयोग करना चाहिए? कुछ मामलों में (उदाहरण के लिए wp_register_script), यह एक "निजी" फ़ंक्शन की तरह लगता है जिसे तीसरे पक्ष का उपयोग नहीं करना चाहिए; हालाँकि, अन्य मामलों में (उदाहरण के लिए wp_plupload_default_settings), यह एक पूरी तरह से उचित तरीके से लगता है कि मनमाने ढंग से जेएस को इंजेक्ट करने से पहले एक लिपिबद्ध है।

मुझे नहीं लगता कि इस बारे में कोई "सही" उत्तर है, लेकिन यह सुनना अच्छा लगेगा कि अन्य देवता क्या सोचते हैं। मैं यह भी कल्पना करता हूं कि इस पहेली के टुकड़े हैं जिन्हें मैंने पूरी तरह से उपेक्षित किया है और यह सुनना अच्छा लगेगा कि दूसरों को इसके बारे में क्या कहना है।

जवाबों:


4

यह फ़ंक्शन स्क्रिप्ट / शैलियों में डेटा जोड़ता है जिसे वर्डप्रेस लोड के दौरान एन्क्यूट किया गया है।

ज़रुरी नहीं। यह स्क्रिप्ट / शैलियों में डेटा जोड़ता है registered

डेटा कुंजी जिसे द्वारा सेट किया wp_localize_scriptजाता है, उसे अंततः कॉल द्वारा अधिलेखित कर दिया जाता है $wp_scripts->add_data, जबकि यदि आप wp_localize_scriptएक ही स्क्रिप्ट के लिए दो बार कॉल करते हैं, तो स्ट्रिंग ठीक से समतल हो जाएगी।

सही। वे दोनों अंतर्निहित (गैर-सुलभ, आंतरिक) एपीआई को कॉल करते हैं, इसलिए यह ओवरराइट हो जाता है (जैसा कि आपने कहा गया है)। यह तब होता है जब यह कॉल करता है $this->get_data( $handle, 'data' );

सवाल

मेरा मुख्य प्रश्न है: क्या डेवलपर्स को इस फ़ंक्शन का उपयोग करना चाहिए?

उत्तर

सीधे शब्दों में कहा: हाँ, जब आपको कोई अन्य मौका नहीं मिला तो आपको वह करने की ज़रूरत है।

एक और उदाहरण: जांचें कि क्या कोई स्क्रिप्ट पंजीकृत थी (उदाहरण के लिए json2/jquery) और इसे पाद लेख (चेक extra['group']) में ले जाएं।

// Move scripts to the footer - in case it isn't already there
if ( ! $wp_scripts->get_data( 'json2', 'group' ) )
    $wp_scripts->add_data( 'json2', 'group', 1 );

if ( ! $wp_scripts->get_data( 'jquery', 'group' ) )
    $wp_scripts->add_data( 'jquery', 'group', 1 );

नोट: यह extra! केवल दर्ज किए गए डेटा के लिए काम करता है !

अतिरिक्त नोट्स

प्रति-प्रश्न: क्या आपने कभी कोर द्वारा पंजीकृत लिपियों पर निर्भरता जोड़ने की कोशिश की है? उदाहरण के लिए: JSON2आवश्यकतानुसार डिपो में जोड़ने का प्रयास करें jQuery। यह अवरोधन के बिना संभव नहीं है global $wp_scripts:

global $wp_scripts;

$scripts = array( 
     'jquery'      => array( 'json2' )
    ,'jquery-form' => array( 'json2' ) 
);

foreach ( $scripts as $handle => $deps )
{
    // Ugly hack: Intercept the global to force the "natural"/needed order: JSON2 » jQuery
    $deps_default =& $wp_scripts->registered[ $handle ]->deps;
    $wp_scripts->registered[ $handle ]->deps = array_merge( $deps_default, $deps );
}

उन चीजों का एक पूरा भार है जो कक्षा नहीं कर सकती। कुछ का उपयोग कर की तरह तो ->add_data()है imo पूरी तरह से वैध। बस आपको जो मिला है उसका उपयोग करें, क्योंकि यह अभी भी बेहतर है फिर कोर कक्षाओं की कमी को जीना।


"प्रतीक्षा करें जब तक कि कोर डिफ़ॉल्ट और अंतर्निहित स्क्रिप्ट में निर्भरता जोड़ने के लिए एक प्रतिगामी जोड़ता है" क्या आपने टीआरसी में एक टिकट खोला था?
13

@scribu धन्यवाद, लेकिन नहीं, मैं नहीं और नहीं, मैं नहीं होगा। मेरे सभी टिकट बस वहां घूमते हैं, इसलिए मैंने टीआरसी टिकट में निवेश के प्रयास से वापस कदम रखा। यह कोई अपराध नहीं है, बस मैंने अभी तक जो अनुभव किया है उससे एक निष्कर्ष। लेकिन आपके साथ बहस शुरू नहीं करने के लिए, मैं इसे हटा दूंगा क्योंकि यह सिर्फ मेरे एक प्लगइन्स से एक साधारण कॉपी / पेस्ट से बचा है।
केसर

ठीक है, तो मुझे लगता है कि मुझे यहां पूछना होगा: jQuery से पहले JSON2 लोड करने से क्या लाभ होगा?
स्क्रिबु

कुछ नहीं, क्योंकि यह एक सार उदाहरण है। यदि आप एक अधिक विस्तृत उदाहरण खोजने की कोशिश करेंगे, तो आप एक पुस्तकालय की आवश्यकता की कल्पना कर सकते हैं JSON2, लेकिन इससे पहले लोड करने की आवश्यकता है jQuery: इसका नाम दें UberjQuery। Btw: जैसा कि आप पागलों की तरह कोर में बहुत अच्छा कर रहे हैं, आप समय क्यों नहीं लेते हैं और एक उत्तर लिखते हैं? मुझे लगता है कि यह पढ़ने के समय के लायक होगा।
केसर

आपके विचारों के लिए धन्यवाद कैसर! मैं निश्चित रूप से जेएस को जोड़ने के तरीकों की तलाश कर रहा हूं जो "एपीआई" द्वारा समर्थित है। जबकि मुझे पता है कि मैं इसे सभी प्रकार के काम करने के लिए झुका सकता हूं, जिससे अस्थिर कोड हो सकता है। यह जानना अच्छा है कि यह क्या कर सकता है इसके बजाय इसका क्या उद्देश्य है, और निश्चित रूप से, इसके साथ बहुत कुछ किया जा सकता है।
टोलमेनज़

1

स्क्रिप्ट डेटा को कैसे संभालना है, इस बारे में WP 3.3 में एक बड़ी बहस हुई:

http://core.trac.wordpress.org/ticket/11520

ध्यान दें कि अब आप नेस्टेड एरेज़ पास कर सकतेwp_localize_data() हैं:

wp_localize_script( 'jquery', 'jQueryL10n', array(
    'foo' => array(
        'bar' => array( 'apple', 'orange' )
    ),
) );

इसलिए, add_data()अगर मैं जो करना चाहता था, उसके लिए कोई उच्च-स्तरीय एपीआई नहीं था , तो मैं समझ सकता हूं कि यह व्यवहार में परिवर्तन हो सकता है, जैसे कि कुछ मामलों में, जैसे कि जब संगति शामिल होती है।


आपके इनपुट Scribu के लिए धन्यवाद! मजेदार है कि आप उस टिकट के लिए लिंक! मैंने अपनी पोस्ट में इसे लिंक किया था, लेकिन इसमें इतना कुछ चल रहा था कि मैं पकड़ नहीं पाया कि अब बहुआयामी सरणियों का समर्थन किया जाता है।
टोलमेनज़

हा ... अच्छा संपादन! जैसा कि मैंने सोचा था कि मैं उस टिकट से भ्रमित नहीं था।
टोलमैंज

@tollmanz हाँ, यह बहुत भ्रामक है, खासकर यदि आप उस समय IRC में नहीं थे।
12:56

श्री @ungestaltbar ने मुझे कुछ महीने पहले बहुआयामी सरणियों को जोड़ने का एक तरीका दिखाया। नहीं पता था, कि यह पहले से ही कोर में है।
केसर

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