Add_action ('init') बनाम add_action ('wp_enqueue_scripts') का उपयोग कब करें


10

मेरे विषय के कार्यों में .php, मैं नियंत्रण के एक उपाय को प्राप्त करने के लिए एक add_action पर कॉल कर रहा हूं जहां jquery लोड किया गया है (मेरे विषय की अन्य लिपियों के साथ पाद लेख में)।

समस्या यह है कि जब मैं add_action ('wp_enqueue_scripts') का उपयोग करता हूं, तो यह केवल तब दिखाई देता है जब कोई प्लग-इन लोड नहीं होता है। हालाँकि, add_action ('init') विधि सभी मामलों में काम करती है।

मुझे याद नहीं है कि क्यों, लेकिन मेरा मानना ​​है कि इस मामले में add_action ('wp_enqueue_scripts') को प्राथमिकता दी जाती है। अगर यह सच है, तो मैं इसे सभी मामलों में कैसे काम कर सकता हूं?

फ़ंक्शन में

//if(!is_admin()){add_action('init', 'my_theme_init');} //THIS WORKS ALL THE TIME
//add_action('wp_enqueue_scripts', 'my_theme_init'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT

if(!is_admin())
{
    require_once(TEMPLATEPATH . '/functions_public.php');   
}

कार्यों में_पब्लिक। एफ.पी.

function my_theme_init()
{

/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script('jquery');

/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);

wp_enqueue_script('jquery');

}

Add_action ('wp_enqueue_scripts') का उपयोग करते हुए 2 विधि, जाहिर तौर पर उन स्थितियों में निष्पादित नहीं होती है जहां एक प्लगइन मौजूद होता है जो थीम के लिए स्क्रिप्ट निर्भरता लिखता है।


5
कृपया jquery की अपनी प्रति पंजीकृत न करें - वर्डप्रेस के साथ भेजे गए संस्करण का उपयोग करें, अन्यथा आप प्लग-इन को समाप्त करेंगे :)
स्टीफन हैरिस

मैं सहमत हूं, वास्तव में मैं jQuery के साथ भेजे गए एक का उपयोग कर रहा हूं। मैं इसे केवल एक .js (mythemescripts.js) में लोड कर रहा हूं, साथ ही http अनुरोधों को कम करने के लिए अन्य js फ़ाइलों के साथ मेरी थीम की आवश्यकता है।
N2Mystic

सभी ब्राउज़रों में, एक बार आपकी साइट से एक बार स्क्रिप्ट का अनुरोध करने के बाद, इसे स्थानीय रूप से कैश किया जाता है। आपके पास केवल पहले पृष्ठ लोड पर अतिरिक्त HTTP अनुरोध होगा। यदि आप सभी लिपियों को एक ही में जोड़ते हैं, तो आपको हर बार यह बदलने के लिए बाध्य किया जाएगा कि WP एक नया संस्करण jQuery के साथ एक अपडेट जारी करता है। यह == रखरखाव दुःस्वप्न।
EAMann

2
@Eannann, जब विषय पहली बार स्थापित किया गया है, और हर बार मेरे विषय विकल्प पृष्ठ को बाद में सहेजा जाता है, मैं mythemescripts.js को फिर से लिख रहा हूं, इसमें jquery लाइब्रेरी की नवीनतम प्रतिलिपि लोड कर रहा हूं। यदि उपयोगकर्ता अपने WP संस्करण को अपडेट करता है, तो मेरा थीम विकल्प रूटीन उस के साथ आने वाले jquery को लोड करता है। इसकी हमेशा तारीख तक।
N2Mystic

समस्या तब भी होती है जब पाद लेख से पहले दस्तावेज़ के शरीर में एक जेकरी कॉल निहित होती है। जाहिरा तौर पर jQuery (दस्तावेज) .js स्क्रिप्ट पाद लेख में लोड होने से पहले ही आग लग जाती है।
N2Mystic

जवाबों:


26

बहुत सारे प्लगइन डेवलपर चीजों को सही तरीके से नहीं करते हैं। सही तरह से करने के लिए पर हुक करने की है wp_enqueue_scriptsतुम क्या करने की कोशिश कर रहे हैं।

हालाँकि, यहाँ हुक एक सामान्य अनुरोध में चलते हैं:

  • muplugins_loaded
  • registered_taxonomy
  • registered_post_type
  • plugins_loaded
  • sanitize_comment_cookies
  • setup_theme
  • load_textdomain
  • after_setup_theme
  • auth_cookie_malformed
  • auth_cookie_valid
  • set_current_user
  • इस में
  • widgets_init
  • register_sidebar
  • wp_register_sidebar_widget
  • wp_default_scripts
  • wp_default_stypes
  • admin_bar_init
  • add_admin_bar_menus
  • wp_loaded
  • parse_request
  • send_headers
  • parse_query
  • pre_get_posts
  • posts_selection
  • WP
  • template_redirect
  • get_header
  • wp_head
  • wp_enqueue_scripts
  • wp_print_styles
  • wp_print_scripts
  • ... बहुत अधिक

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

मेरी अनुशंसा आपके कार्य को दो भागों में विभाजित करने की होगी। अपने wp_deregister_script/ हुक wp_register_scriptपर करें initऔर wp_enqueue_scriptsजब आप वास्तव में jQuery का उपयोग करें तो हुक का उपयोग करें ।

यह आपको अपनी स्क्रिप्ट्स को जोड़ने के लिए "सही कर रहा है" की दुनिया में रखेगा, और आपको कतार में जोड़ने से पहले अपने संक्षिप्त संस्करण के लिए jQuery को स्वैप करके अभी भी "गलत तरीके से कर रहे" सैकड़ों डेवलपर्स से बचाने में मदद करेगा। ।

आप initउच्च प्राथमिकता के साथ अपना हुक भी जोड़ना चाहेंगे :

add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
    // ...
}

2
मैं यह सिफारिश करने जा रहा था, लेकिन फिर मुझे महसूस हुआ कि ओपी वास्तव में jQuery को deregistering कर रहा था, और फिर पूरी तरह से एक अलग स्क्रिप्ट रजिस्टर करना और इसे "jquery" कहना। मुझे नहीं लगता कि प्रोत्साहित करने के लिए यह एक अच्छा अभ्यास है, और यह सोचें कि एक बेहतर मार्ग बस jQuery को पूरी तरह से समाप्त करने के लिए होगा , और फिर कस्टम हैंडल का उपयोग करके कस्टम स्क्रिप्ट को संलग्न करें ।
चिप बेनेट

priorityकार्रवाई जोड़ने के बारे में ध्यान देने के लिए इंगित करें। यह सब इस बात पर निर्भर करता है कि आप प्राथमिकता को कैसे देखते हैं। यदि आप चाहते हैं कि आपका "पहले" चलना है, तो कम संख्या बेहतर है - निष्पादन कतार क्रम में एक उच्च प्राथमिकता। लेकिन अगर आप चाहते हैं कि आपके कार्य का असर दूसरों पर पड़े, तो आप इसे बाद में चलाना चाहेंगे - इसलिए "प्रभाव" द्वारा उच्च प्राथमिकता। और इस मामले में, यह संभवतः एक उच्च संख्या है जो आप चाहते हैं। हालांकि, पिछले टिप्पणीकार के अनुसार, jquery के RTM संस्करण को स्वैप करने में बहुत कम योग्यता है।
पॉल जी।

3

यहां कई मुद्दे हैं, जो अंतर-संबंधित हैं।

  1. स्क्रिप्ट्स का उपयोग करने के लिए सही एक्शन हुक है wp_enqueue_scripts
  2. के माध्यम से पाद लेख में स्क्रिप्ट मुद्रित करने के लिए wp_enqueue_script(), $footerपैरामीटर सेट करेंtrue
  3. आपकी add_action( $hook, $callback )कॉल किसी भी चीज़ में लिपटी नहीं होनी चाहिए; उन्हें सीधे निष्पादित करेंfunctions.php
  4. आपको अपनी कॉलबैक के अंदर अपनीis_admin() सशर्त जांच करनी चाहिए
  5. आप किसी भी कारण से, किसी थीम से मुख्य-बंडल वाली स्क्रिप्ट को नहीं मिटा सकते। यहां तक ​​कि अगर आपका उद्देश्य स्क्रिप्ट कॉन्सेप्टन है, तो यह प्लगइन क्षेत्र है
  6. आप तो चाहिए jQuery अपंजीकृत, तो wp_enqueue_scriptsहै बहुत देर हो चुकी । अपने डेरेगिस्टर / रजिस्टर कोड को एक कॉलबैक में विभाजित करें जिसे हुक किया गया है init
  7. कुछ अन्य स्क्रिप्ट को "jquery" कहना भी एक अच्छा अभ्यास नहीं है। आपका बेहतर दांव बस jQuery को धोखा देना होगा , और फिर अपनी कस्टम स्क्रिप्ट को लोड करना होगा।
  8. अपने कॉलबैक पर कम प्राथमिकता देना सुनिश्चित करें, ताकि आप प्लगइन्स को ओवरराइड करें
  9. के get_template_directory()बजाय का उपयोग करेंTEMPLATEPATH

यह सब एक साथ डालें:

<?php
function wpse55924_enqueue_scripts() {
    if ( ! is_admin() ) {

        // Dequeue jQuery
        wp_dequeue_script( 'jquery' );

        // Register/enqueue a custom script, that includes jQuery
        wp_register_script( 'mythemescripts', get_template_directory_uri() . '/scripts.mythemescripts.js', false, false,true );
        wp_enqueue_script( 'mythemescripts' ); 
    }
}
add_action( 'wp_enqueue_scripts', 'wpse55924_enqueue_scripts', 99 );

लेकिन फिर से: यह वास्तव में सबसे अच्छा तरीका नहीं है। आपकी बेहतर शर्त बस प्लगइन add_action () कॉलबैक को हटाने के लिए है जो कि deregister core jQuery - या प्लगइन्स का उपयोग करते हैं जो कोर बंडल बंडल jQuery की जगह के रूप में इतनी लापरवाही से कुछ नहीं करते हैं।


ओपी, jQuery के WP-वितरित संस्करण को कुछ अन्य लिपियों के साथ प्रोग्रामेटिक रूप से जोड़ रहा है ताकि सभी JS फाइलों को लोड करने के लिए उनके विषय में केवल एक HTTP अनुरोध किया जाए। तो कस्टम स्क्रिप्ट में jQuery होता है और इस तरह लोड होने पर कुछ भी नहीं टूटेगा। संयुक्त 'जेकेरी' हैंडल को ओवरराइट करने के लिए दो बार लोडिंग jQuery को रोकने के लिए आवश्यक है - एक बार संयुक्त जेएस फ़ाइल में और फिर से किसी भी प्लगइन्स द्वारा jQuery को अपने दम पर लेने का प्रयास करके।
एमान

यह शब्दार्थ और व्यावहारिक रूप _doing_it_wrong()से कुछ ऐसा है जिसे सिर्फ jQuery "jQuery" नहीं कहा जाता है । इसके अलावा: jQuery ही यह सुनिश्चित करने के लिए कि इसे दो बार लोड नहीं किया गया है, केवल छला जा सकता है। wp_dequeue_script()कॉल सिर्फ एक पर्याप्त प्राथमिकता के साथ होने की बाद में कि कुछ भी नहीं enqueues सुनिश्चित करने के लिए यह आवश्यक है।
चिप बेनेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.