অ্যাড_অ্যাকশন ('init') বনাম অ্যাডঅ্যাকশন ('wp_enqueue_scriptts') কখন ব্যবহার করবেন


10

আমার থিমের ফাংশন.এফপি-তে, যেখানে জকিউয়ারি লোড করা হয়েছে (আমার থিমের অন্যান্য স্ক্রিপ্টগুলির সাথে ফুটারে) নিয়ন্ত্রণের পরিমাণ অর্জনের জন্য আমি একটি অ্যাডঅ্যাকশন কল করছি।

আমার যে সমস্যাটি হচ্ছে তা হ'ল আমি যখন যুক্ত_অ্যাকশন ('wp_enqueue_scriptts') ব্যবহার করি তখন কোনও প্লাগইন লোড না হলে এটি কেবল আগুনে প্রদর্শিত হয়। তবে, অ্যাডঅ্যাকশন ('init') পদ্ধতিটি সব ক্ষেত্রেই কাজ করে।

আমি কেন তা মনে করতে পারি না তবে আমি বিশ্বাস করি যে এই ক্ষেত্রে অ্যাডঅ্যাকশন ('wp_enqueue_scriptts') বেশি পছন্দ করা হয়। যদি এটি সত্য হয় তবে আমি কীভাবে এটি সমস্ত ক্ষেত্রে কাজ করতে পারি?

ফাংশন.এফপি-তে

//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');

}

২ য় পদ্ধতি, অ্যাডঅ্যাকশন ('wp_enqueue_scriptts') ব্যবহার করে স্পষ্টতই এমন পরিস্থিতিতে কার্যকর করা হয় না যেখানে কোনও প্লাগইন উপস্থিত থাকে যা থিমের স্ক্রিপ্ট নির্ভরতা লেখায়।


5
দয়া করে আপনার নিজের jquery অনুলিপিটি নিবন্ধভুক্ত করবেন না - ওয়ার্ডপ্রেসের সাথে প্রেরিত সংস্করণটি ব্যবহার করুন, অন্যথায় আপনি প্লাগইনগুলি ভেঙে ফেলবেন :)
স্টিফেন হ্যারিস

আমি সম্মত হই, আসলে আমি jQuery এর সাথে প্রেরিত একটি ব্যবহার করছি। আমি এইচএসপি অনুরোধগুলি হ্রাস করার জন্য আমার থিমের অন্যান্য জেএস ফাইলগুলির সাথে এটি কেবল একটি একক .js (mythemescriptts.js) এ লোড করছি।
এন 2 মাইস্টিক

সমস্ত ব্রাউজারগুলিতে একবার আপনার সাইট থেকে একবার স্ক্রিপ্ট অনুরোধ করা হয়, এটি স্থানীয়ভাবে ক্যাশে করা হয়। প্রথম পৃষ্ঠার লোডটিতে আপনার কাছে কেবল অতিরিক্ত HTTP অনুরোধ থাকবে। আপনি যদি সমস্ত স্ক্রিপ্টগুলি একক মধ্যে একত্রিত করেন, আপনি প্রতিবার ডাব্লুপি jQuery এর নতুন সংস্করণ সহ একটি আপডেট প্রকাশ করার সময় এটি পরিবর্তন করতে বাধ্য হবেন। এটি == রক্ষণাবেক্ষণ দুঃস্বপ্ন।
EAMAN

2
@ এ্যামান, যখন থিমটি প্রথম ইনস্টল করা হবে এবং এর পরে প্রতিবার আমার থিম বিকল্প পৃষ্ঠাটি সংরক্ষণ করা হবে তখন আমি মাইথেমস্ক্রিপ্টস.জেএসটি আবার লিখছি, এতে জ্যাকেই লাইব্রেরির সর্বশেষ কপিটি লোড করছি। যদি ব্যবহারকারী তাদের ডাব্লুপি সংস্করণ আপডেট করে তবে আমার থিম বিকল্পগুলির রুটিনটি সেই সাথে আসা জ্যাকুরিটিকে লোড করে। এটি সর্বদা আপ টু ডেট।
এন 2 মাইস্টিক

পাদলেখের আগে ডকুমেন্টের শরীরে যখন একটি jquery কল থাকে তখনও সমস্যা দেখা দেয়। দৃশ্যত jQuery (দস্তাবেজ) .js স্ক্রিপ্ট ফুটার মধ্যে লোড করা আগে প্রস্তুত আগুন।
এন 2 মিস্টিক

উত্তর:


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 সজ্জিত করবেন।

এটি আপনার স্ক্রিপ্টগুলিকে সজ্জিত করার জন্য "এটি সঠিকভাবে করার" বিশ্বে আপনাকে রক্ষা করবে এবং শত শত বিকাশকারীদের আপনার ক্যানেটেটেড সংস্করণে কুইকে যুক্ত করার আগে জিকুয়েরি অদলবদল করে "এটি ভুল করে" রক্ষা করতে সহায়তা করবে they ।

আপনি initএকটি উচ্চ অগ্রাধিকার সহ আপনার হুক যুক্ত করতে চাইবেন :

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

2
আমি এটি সুপারিশ করতে যাচ্ছিলাম, কিন্তু তখন আমি বুঝতে পারি যে ওপি আসলে jQuery কে নিবন্ধন করছে এবং তারপরে সম্পূর্ণ আলাদা স্ক্রিপ্টটি নিবন্ধভুক্ত করছে এবং এটিকে "jquery" হিসাবে ডাকে। আমি মনে করি না যে এটি উত্সাহিত করার জন্য একটি ভাল অনুশীলন, এবং আমি মনে করি যে আরও ভাল রুটটি কেবল jQuery সম্পূর্ণরূপে সন্ধান করা এবং তারপরে একটি কাস্টম হ্যান্ডেল ব্যবহার করে কাস্টম স্ক্রিপ্ট সজ্জিত করা ।
চিপ বেনেট

priorityক্রিয়া যুক্ত করার বিষয়ে লক্ষ্য করুন । এটি সমস্ত কীভাবে আপনি অগ্রাধিকার দেখেন তার উপর নির্ভর করে view আপনি যদি নিজের "প্রথম" চালনাতে চান তবে কম সংখ্যাটি ভাল - মৃত্যুদন্ড কার্যকর সারির ক্রমে একটি উচ্চ অগ্রাধিকার। তবে আপনি যদি নিজের ফাংশনের প্রভাবটি অন্যের চেয়ে বেশি পছন্দ করতে চান তবে আপনি এটি পরে চালিত করতে চান - সুতরাং "প্রভাব" দ্বারা একটি উচ্চ অগ্রাধিকার। এবং এই ক্ষেত্রে এটি সম্ভবত একটি উচ্চতর নম্বর যা আপনি চান। যদিও পূর্ববর্তী মন্তব্যকারীদের পরামর্শ অনুসারে, jquery এর আরটিএম সংস্করণ অদলবদল করতে সামান্য মেধা আছে।
পল জি।

3

এখানে একাধিক সমস্যা রয়েছে, এটি আন্তঃসম্পর্কিত।

  1. স্ক্রিপ্টগুলি সারিবদ্ধ করার জন্য সঠিক ক্রিয়া হুকটি হ'ল wp_enqueue_scripts
  2. এর মাধ্যমে ফুটারে স্ক্রিপ্টগুলি মুদ্রণ wp_enqueue_script()করতে $footerপ্যারামিটারটি এতে সেট করুনtrue
  3. আপনার add_action( $hook, $callback )কলগুলি কোনও কিছুতে মোড়ানো উচিত নয়; তাদের সরাসরি থেকে মৃত্যুদণ্ড কার্যকর করা যাকfunctions.php
  4. আপনার is_admin()শর্তযুক্ত চেকগুলি আপনার কলব্যাকের ভিতরে রাখা উচিত
  5. কোনও কারণেই আপনার কোনও থিম থেকে কোর-বান্ডিল স্ক্রিপ্টগুলি নিবন্ধন করা উচিত নয়। এমনকি যদি আপনার উদ্দেশ্য স্ক্রিপ্ট সংমিশ্রণ হয় তবে এটি প্লাগইন অঞ্চল
  6. আপনি যদি আবশ্যক jQuery deregister, তারপর wp_enqueue_scriptsহয় খুব দেরি । আপনার নিবন্ধন / নিবন্ধকৃত কোডটি কলব্যাকের মধ্যে বিভক্ত করুন init
  7. অন্য কিছু স্ক্রিপ্টকে "জ্যাকুয়ারি" বলাও সম্ভবত একটি ভাল অনুশীলন নয়। আপনার আরও ভাল বাজিটি হ'ল 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 );

তবে আবার: এটি সত্যিই সেরা পদ্ধতির নয়। আপনার আরও ভাল বাজি হ'ল মূল jQuery কে নিবন্ধিত করে এমন প্লাগইন অ্যাড_অ্যাকশন () কলব্যাকগুলি সরিয়ে ফেলা - বা এমন কোনও প্লাগইন ব্যবহার করুন যা কোর-বান্ডেলযুক্ত jQuery প্রতিস্থাপনের মতো এত বেপরোয়া কিছু না করে।


ওপি jQuery এর ডাব্লুপি-বিতরণিত সংস্করণটিকে কিছু অন্যান্য স্ক্রিপ্টগুলিতে প্রোগ্রামক্রমে একত্রিত করছে যাতে সমস্ত জেএস ফাইল লোড করার জন্য তাঁর থিম দ্বারা কেবল একটি এইচটিটিপি অনুরোধ জানানো হয়। সুতরাং কাস্টম স্ক্রিপ্টগুলিতে jQuery থাকে না এবং এইভাবে লোড করা থাকলে কোনও কিছুই ভাঙবে না। সম্মিলিত জেএস ফাইলে একবার এবং আবার কোনও প্লাগইন তাদের নিজস্বভাবে jQuery সজ্জিত করার চেষ্টা করে - jQuery লোড করা প্রতিরোধ করার জন্য নিবন্ধিত 'jquery' হ্যান্ডেলটি ওভাররাইটিং করা প্রয়োজন।
ইমান

শব্দার্থগত এবং ব্যবহারিকভাবে এমন কোনও_doing_it_wrong() কল করা যা কেবল jQuery "jQuery" নয়। এছাড়াও: jQuery এর নিজেই কেবল যাবে dequeued অনুক্রমে তা নিশ্চিত করতে দুইবার লোড হয় না। এই wp_dequeue_script()কলটি পর্যাপ্ত অগ্রাধিকার সহকারে হওয়া দরকার তা নিশ্চিত করার জন্য যে এর পরে কোনও কিছুই এ্যালুক করে না।
চিপ বেনেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.