निर्भरता के कारण wp enqueue इनलाइन स्क्रिप्ट


35

इनलाइन स्क्रिप्ट के लिए wp_enqueue_script () का उपयोग करने का कोई तरीका है?

मैं ऐसा इसलिए कर रहा हूं क्योंकि मेरी इनलाइन स्क्रिप्ट किसी अन्य स्क्रिप्ट पर निर्भर करती है और मैं इसे लोड करने के बाद इसे सम्मिलित करने का लचीलापन चाहूंगा।

इसके अलावा, यह एक इनलाइन स्क्रिप्ट है क्योंकि मैं जावास्क्रिप्ट (जैसे विषय पथ, आदि) में php चर पारित कर रहा हूँ

अग्रिम में धन्यवाद।

जवाबों:


33

ठीक है, आपके पास wp_localize_script () है, लेकिन यह केवल डेटा पास करने के लिए है।

अन्यथा, आप ऐसा कर सकते हैं:

function print_my_inline_script() {
  if ( wp_script_is( 'some-script-handle', 'done' ) ) {
?>
<script type="text/javascript">
// js code goes here
</script>
<?php
  }
}
add_action( 'wp_footer', 'print_my_inline_script' );

विचार यह है कि आप अपने इनलाइन स्क्रिप्ट मुद्रित किया जा रहा पर भरोसा नहीं करना चाहिए वास्तव में स्क्रिप्ट के बाद उस पर निर्भर है, लेकिन बाद।


4
निश्चित रूप से यह केवल तभी काम करता है जब आप जिस स्क्रिप्ट पर निर्भर होते हैं वह पहले से ही आउटपुट हो? यदि आपके द्वारा निर्भर की गई स्क्रिप्ट wp_footer में भी पंजीकृत है, और इनलाइन स्क्रिप्ट कोड के बाद निष्पादित होती है, तो इनलाइन स्क्रिप्ट केवल क्लाइंट को नहीं लिखी जाएगी, और इसलिए निष्पादित की जाती है?
सैम शांति

6
वर्डप्रेस 4.5 के रूप में आप wp_add_inline_script() वर्डप्रेस jquery के साथ wp_add_inline_script का
Dhinju दिवाकरन

7

बस इसे एक इनलाइन स्क्रिप्ट नहीं बनाते हैं और फिर इसे डायनामिक मापदंडों को चर के रूप में पास करते हैं। ओटो ने इसे प्रभावी ढंग से करने के लिए एक महान मार्गदर्शिका लिखी है

वर्डप्रेस 3.3 इसे और अधिक शक्तिशाली बनाएगा: https://core.trac.wordpress.org/ticket/11520


7

यह समाधान @ scribu के उत्तर के समान है , लेकिन यह इसके प्रकार का अनुसरण करता है wp_enquque_script(), और यदि इसकी निर्भरता शीर्षलेख में शामिल की जाती है, तो यह स्क्रिप्ट को हेडर में रखेगा।

/**
 * Enqueue inline Javascript. @see wp_enqueue_script().
 * 
 * KNOWN BUG: Inline scripts cannot be enqueued before 
 *  any inline scripts it depends on, (unless they are
 *  placed in header, and the dependant in footer).
 * 
 * @param string      $handle    Identifying name for script
 * @param string      $src       The JavaScript code
 * @param array       $deps      (optional) Array of script names on which this script depends
 * @param bool        $in_footer (optional) Whether to enqueue the script before </head> or before </body> 
 * 
 * @return null
 */
function enqueue_inline_script( $handle, $js, $deps = array(), $in_footer = false ){
    // Callback for printing inline script.
    $cb = function()use( $handle, $js ){
        // Ensure script is only included once.
        if( wp_script_is( $handle, 'done' ) )
            return;
        // Print script & mark it as included.
        echo "<script type=\"text/javascript\" id=\"js-$handle\">\n$js\n</script>\n";
        global $wp_scripts;
        $wp_scripts->done[] = $handle;
    };
    // (`wp_print_scripts` is called in header and footer, but $cb has re-inclusion protection.)
    $hook = $in_footer ? 'wp_print_footer_scripts' : 'wp_print_scripts';

    // If no dependencies, simply hook into header or footer.
    if( empty($deps)){
        add_action( $hook, $cb );
        return;
    }

    // Delay printing script until all dependencies have been included.
    $cb_maybe = function()use( $deps, $in_footer, $cb, &$cb_maybe ){
        foreach( $deps as &$dep ){
            if( !wp_script_is( $dep, 'done' ) ){
                // Dependencies not included in head, try again in footer.
                if( ! $in_footer ){
                    add_action( 'wp_print_footer_scripts', $cb_maybe, 11 );
                }
                else{
                    // Dependencies were not included in `wp_head` or `wp_footer`.
                }
                return;
            }
        }
        call_user_func( $cb );
    };
    add_action( $hook, $cb_maybe, 0 );
}

// Usage
enqueue_inline_script('test','alert(\'enqueue inline script test\');',array( 'jquery'));

नोट: यह अनाम फ़ंक्शंस का उपयोग करता है, लेकिन 5.3 से पहले PHP संस्करणों के लिए इसे आसानी से एक वर्ग में परिवर्तित किया जा सकता है।


5

वर्डप्रेस 4.5 के बाद से आप wp_add_inline_script () का उपयोग कर सकते हैं :

add_action( 'wp_enqueue_scripts', 'cyb_enqueue_scripts' );
function cyb_enqueue_scripts() {
   wp_enqueue_script( 'myscript', 'url/to/myscript.js', array(), '1.0' );
   wp_add_inline_script( 'myscript', 'Your inline javascript code gos here' );
}

4

बेहतर तरीका है जो मैंने पाया है wp_localize_script(), जैसा कि @scribu ने सुझाया है।

आमतौर पर, मैंने इन-लाइन जावास्क्रिप्ट का उपयोग करने का फैसला किया क्योंकि मुझे अपनी स्क्रिप्ट में कुछ PHP चर प्रदान करने की आवश्यकता थी। इससे हल किया जा सकता है wp_localize_script()। मैं एक उदाहरण प्रदान करूंगा:

आपके पास $aFooकुछ विकल्पों के साथ एक सरणी है और इसे स्क्रिप्ट में पास करने की आवश्यकता है।

$aFoo = array( 'option1' => $option1Value, 'option2' => $option2Value ); 

इन-लाइन स्क्रिप्ट का उपयोग करना:

<script> 
    var oFoo = {};
    oFoo.option1 = <?php echo $aFoo['option1'] ?>;  
    oFoo.option2 = <?php echo $aFoo['option2'] ?>;            
    //do some stuff with oFoo
</script>

का उपयोग कर wp_localize_script():

wp_register_script( 'script_name', 'pathToScript/script.js', array( 'jquery' )); //if jQuery is not needed just remove the last argument. 
wp_localize_script( 'script_name', 'object_name', $aFoo ); //pass 'object_name' to script.js
wp_enqueue_script( 'script_name' );    

फिर, pathToScript/script.jsयह होगा:

var oFoo = {};
oFoo.option1 = object_name.option1;   
oFoo.option2 = object_name.option2;            
//do some stuff with oFoo (no PHP needed)

इस तरह से आपको इन-लाइन स्क्रिप्ट कदापि नहीं चाहिए।


3

स्क्राइब बिल्कुल सही है। वैसे भी, मैं कुछ जानकारी जोड़ना चाहता हूं:

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

function print_script_once() {
    if(!wp_script_is('my-handle', 'done')) {
        echo "<script>alert('once!');</script>";
        global $wp_scripts;
        $wp_scripts->done[] = 'my-handle';
    }
}
add_action('get_footer', print_script_once);

इस पद्धति का उपयोग करके मैं एक बार इनलाइन स्क्रिप्ट को प्रिंट करने में सक्षम हूं। मेरे मामले में मेरे पास एक फ़ंक्शन है जो एक शेयर-बटन बनाता है और सभी बटन के लिए एक स्क्रिप्ट निष्पादित करने की आवश्यकता है। लेकिन केवल एक बार।


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