নির্ভরতা সহ একটি স্ক্রিপ্ট লোড করা হচ্ছে, অন্য স্ক্রিপ্টের নির্ভরতা আনলোড করা হচ্ছে


9

প্রথমত, আমি সচেতন যে আমার প্রশ্নটি WooCommerce প্লাগইনটির সাথে আমার কাজের প্রসঙ্গে ঘটছে, যা সাধারণত এটিকে বিষয়বস্তু করে তোলে। যাইহোক, আমি আমার প্রশ্ন সম্পর্কিত বলে মনে করি wp_enqueue_script, তাই আশা করি এটি এখনও বিষয়টিতে রয়েছে।

সুতরাং WooCommerce admin_enqueue_scriptsহুক উপর একটি স্ক্রিপ্ট নিবন্ধন করা হয় । এই স্ক্রিপ্টটির একগুচ্ছ নির্ভরতা প্রয়োজন:

wp_register_script( 'wc-admin-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes' . $suffix . '.js', array( 'jquery', 'jquery-ui-datepicker', 'jquery-ui-sortable', 'accounting', 'round', 'ajax-chosen', 'chosen', 'plupload-all' ), WC_VERSION );

(এটি কোডের পরে কিছু পরে পণ্যের পোস্টের জন্য পোস্ট.এইচপিপি এবং পোস্ট-নিউ.এফপি পৃষ্ঠায় সজ্জিত)

WooCommerce এর সাথে কাজ করতে আমি যে কাস্টম প্লাগিনটি লিখছি তাতে আমি একই হুকটিতে একটি স্ক্রিপ্টও লোড করছি।

wp_enqueue_script( 'My_Plugin_Metabox', My_Plugin_Class()->plugin_url() . '/assets/js/mnm-write-panel.js', array( 'jquery', 'wc-admin-meta-boxes'), My_Plugin_Class()->version, true );

আমি যদি আমার প্লাগইনটির স্ক্রিপ্ট সারণী করি এবং অনিবার্যভাবে $in_footerপ্যারামিটার সেট করে trueথাকি তবে jQuery UI তারিখপিকার স্ক্রিপ্ট লোড হয় না (উত্স কোডে মোটেই নেই) এবং কনসোলটি সংশ্লিষ্ট স্ক্রিপ্ট ত্রুটিগুলি দেখায়।

আমি যদি আমার স্ক্রিপ্টটি হেডারে লোড করি তবে এটি কোনও সমস্যা নয়। আমি যদি wc-admin-meta-boxesনির্ভরতা ছাড়াই আমার স্ক্রিপ্টটি লোড করি , তবে এটিও সমস্যার সমাধান করে

সুতরাং আমি যা ভাবছি তা হ'ল, কেন আমার স্ক্রিপ্টটিকে পাদলেখায় লোড করা মূল ডেটপিকারের স্ক্রিপ্টটির লোডকে প্রভাবিত করে? (আমি আমার স্ক্রিপ্টে ডেটপিকারটি একেবারেই ব্যবহার করছি না)) বা উ স্ক্রিপ্টকে নির্ভরতা হিসাবে না রাখলে ডেটপিকার স্ক্রিপ্টকেও প্রভাব ফেলবে কেন? আমার কাছে মনে হচ্ছে ডেটপিকার স্ক্রিপ্টটি লো মেটাবক্স স্ক্রিপ্টের নির্ভরতা হিসাবে বিবেচনা করেই লোড করা উচিত, তবে এটি ঘটছে না।

কায়সারের মন্তব্যে, আমি নিম্নলিখিত এমইউ প্লাগইন তৈরি করেছি (মন্তব্যগুলি থেকে সামঞ্জস্য করা কারণ $GLOBALS['wp_scripts']একটি বস্তু:

/* Plugin Name: Dump jQUI Dp */ 

add_action( 'shutdown', 'so_dump_query_ui_dependencies' );
function so_dump_query_ui_dependencies() {  
    echo 'Does jQuery UI DatePicker script exist per default in&hellip;?<br>';  
    $s = 'jquery-ui-datepicker';    
    printf( 'The registered Dependencies Array: %s', isset( $GLOBALS['wp_scripts']->registered[ $s ] ) ? 'yep ' : 'nope ' );    
    printf( 'The Dependencies loaded in the footer: %s', isset( $GLOBALS['wp_scripts']->in_footer[ $s ] ) ? 'yep ' : 'nope ' );     
    printf( 'The Dependencies printed to the DOM: %s', isset( $GLOBALS['wp_scripts']->done[ $s ] ) ? 'yep ' : 'nope ' );    
    echo 'All nope? Well, then&hellip;'; 
}

কেবলমাত্র WooCommerce 2.2.8 সক্রিয় সঙ্গে, ফলাফলটি পড়ে:

নিবন্ধিত নির্ভরতা অ্যারে: হ্যাঁ পাদলে লোভিত
নির্ভরতা: না, ডিওমে
মুদ্রিত নির্ভরতা: না

WooCommerce 2.2.8 এর সাথে আমার নতুন "ডামি" প্লাগইন সহ ফলাফলটি একই রকম পড়বে (আমার স্ক্রিপ্টটি ফুটারে লোড হয়েছে কিনা):

নিবন্ধিত নির্ভরতা অ্যারে: হ্যাঁ পাদলে লোভিত
নির্ভরতা: না, ডিওমে
মুদ্রিত নির্ভরতা: না

ডামি প্লাগইন

এছাড়াও মন্তব্যগুলি অনুযায়ী, আশা করি অন্যদের জন্য সমস্যাটি পুনরুত্পাদন করার জন্য একটি ডামি প্লাগইন এখানে রয়েছে। কেবলমাত্র পণ্য পোস্টের ধরণের অ্যাডমিন পৃষ্ঠাগুলিতে স্ক্রিপ্ট লোড করার জন্য আমি আমার বিদ্যমান প্লাগইনটি পুরোপুরি নামিয়ে দিয়েছি । আমি এখনও ডেট পিকার লোডটি দেখছি যখন $in_footerমিথ্যা হয় এবং কখন $in_footerসত্য হয় না load

<?php
/*
Plugin Name: WooCommerce Dummy Plugin
Plugin URI: http://wordpress.stackexchange.com/q/168688/6477
Author: helgatheviking
Description: Enqueue a script, miraculously dequeue datepicker
*/


/**
 * The Main My_Dummy_Plugin class
 **/
if ( ! class_exists( 'My_Dummy_Plugin' ) ) :

class My_Dummy_Plugin {

    /**
     * @var My_Dummy_Plugin - the single instance of the class
     */
    protected static $_instance = null;

    /**
     * variables
     */
    public $version = '1.0.0';

    /**
     * Main My_Dummy_Plugin instance.
     *
     * Ensures only one instance of My_Dummy_Plugin is loaded or can be loaded
     *
     * @static
     * @return My_Dummy_Plugin - Main instance
     */
    public static function instance() {
        if ( is_null( self::$_instance ) ) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }


    /**
     * Cloning is forbidden.
     */
    public function __clone() {
        _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?' ) );
    }


    /**
     * Unserializing instances of this class is forbidden.
     */
    public function __wakeup() {
        _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?' ) );
    }


    /**
     * My_Dummy_Plugin Constructor
     *
     * @access  public
     * @return  My_Dummy_Plugin
     */
    public function __construct() {

        add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );

    }


    /*-----------------------------------------------------------------------------------*/
    /* Helper Functions */
    /*-----------------------------------------------------------------------------------*/

    /**
     * Get the plugin url.
     *
     * @return string
     */
    public function plugin_url() {
        return untrailingslashit( plugins_url( '/', __FILE__ ) );
    }


    /**
     * Get the plugin path.
     *
     * @return string
     */
    public function plugin_path() {
        return untrailingslashit( plugin_dir_path( __FILE__ ) );
    }

    /*-----------------------------------------------------------------------------------*/
    /* Load scripts */
    /*-----------------------------------------------------------------------------------*/

    public function admin_scripts() {

        // Get admin screen id
        $screen = get_current_screen();

        // Product post type page only
        if ( in_array( $screen->id, array( 'product' ) ) ) {

            wp_enqueue_script( 'My_Dummy_Plugin_Metabox', $this->plugin_url() . '/assets/js/metabox.js', array( 'jquery', 'wc-admin-meta-boxes'), $this->version, true );

        }

    }

} //end class: do not remove or there will be no more guacamole for you

endif; // end class_exists check


/**
 * Returns the main instance of My_Dummy_Plugin
 *
 * @return WooCommerce
 */
function My_Dummy_Plugin() {
    return My_Dummy_Plugin::instance();
}

// Launch the whole plugin
My_Dummy_Plugin();

1
উৎসুক. ফুটারে সারি করার সময় আপনি কি WooCommerce এর উপরে বা নীচে আপনার স্ক্রিপ্টগুলি সারি করার জন্য আপনার ক্রিয়াটির অগ্রাধিকার সেট করার চেষ্টা করেছেন? আমি অভিন্ন নির্ভরতা ব্যবহার করে প্লাগইনগুলির সাথে দৃষ্টান্ত পাঠিয়েছি এবং এটি এর প্রতিটি উদাহরণকে নিবন্ধভুক্ত করেছে এবং কোনও কারণে এটি এটি স্থির করেছে। (আমি এটাকে বেশি ভাবিনি)। যদিও শিরোলেখ বনাম পাদলেখের মধ্যে সারি করার মধ্যে কখনও কোনও পার্থক্য তৈরি করেনি।
BODA82

আমি ভাবছি অন্য সব মন্তব্যে কী হয়েছে? যাইহোক, @ BODA82, আমি এর চেষ্টা করিনি। কিন্তু একটি অগ্রাধিকার যোগ করে datepicker লোড রাখা সঠিকভাবে এমনকি যখন $in_footerআমার নিজের স্ক্রিপ্ট উপর সত্য।

1
এটি আমার কাছে ডাব্লুপি-তে একটি বাগের মতো দেখায় - আমি যুক্তিটি অনুসরণ করি নি তবে আপনি do_itemsযদি "ডাব্লুপি-অন্তর্ভুক্ত / শ্রেণি-ডাব্লু-নির্ভরতা.পিএফপি" এর ফাংশনটি 122-125 লাইনে দেখেন তবে কোডটি কেবল আনসেটস করে To_do তালিকার আইটেমটি do_itemসফল হয় কিনা list আপনাকে যারা লাইন পরিবর্তন করলে if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }তারপর বাগ দূরে যায় ...
Bonger

2
এটি একটি ডব্লিউপি বাগ - ট্র্যাক দেখুন # 25247 । আমি একটি প্যাচ প্রস্তাব করেছি (গিটলস্ট সি'স্ট মোই)।
Bonger

@ ব্রোঞ্জার চূড়ান্ত উত্তরের জন্য ধন্যবাদ। আপনি যদি নিজের মন্তব্যে কোনও উত্তরে সরিয়ে নিতে চান তবে আমি তা গ্রহণ করব। স্পষ্টতই, নির্ভরতা নরক।
হেলগাটিভিকিং

উত্তর:


2

বর্তমানে আপনি লাইব্রেরিগুলির জন্য wp_enqueue_script () ব্যবহার করে জোর করে চাপিয়ে দিতে পারেন:

wp_enqueue_script('jquery');
wp_enqueue_script('jquery-ui');

আমি জানি যে এটি স্বয়ংক্রিয়ভাবে লোড হয়, তবে এটি সেভাবে কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.