กำลังโหลดสคริปต์ด้วยการขึ้นต่อกันกำลังยกเลิกการโหลดการพึ่งพาของสคริปต์อื่น


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

(มีการจัดคิวเฉพาะบนหน้า post.php และ post-new.php สำหรับประเภทผลิตภัณฑ์โพสต์ในภายหลังในรหัส)

ในปลั๊กอินที่กำหนดเองที่ฉันเขียนเพื่อทำงานกับ 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 Datepicker จะไม่โหลด (ไม่ใช่ในซอร์สโค้ดเลย) และคอนโซลแสดงข้อผิดพลาดของสคริปต์ที่สอดคล้องกัน

ถ้าฉันโหลดสคริปต์ของฉันในส่วนหัวนี่ไม่ใช่ปัญหา หากฉันโหลดสคริปต์โดยไม่ต้องwc-admin-meta-boxesพึ่งพาสิ่งเหล่านี้ก็จะช่วยแก้ไขปัญหาได้เช่นกัน

ดังนั้นสิ่งที่ฉันสงสัยคือทำไมการโหลดสคริปต์ของฉันในส่วนท้ายมีผลต่อการโหลดสคริปต์หลัก datepicker? (ฉันไม่ได้ใช้ datepicker ในสคริปต์เลย) หรือทำไมการไม่มีสคริปต์ Woo เป็นการพึ่งพาก็จะมีผลกับสคริปต์ datepicker ด้วย? สำหรับฉันดูเหมือนว่าสคริปต์ datepicker ควรจะโหลดไม่ว่าจะเป็นการพึ่งพาของสคริปต์ Woo metabox หรือไม่ แต่สิ่งนี้ไม่ได้เกิดขึ้น

ต่อความคิดเห็นของ Kaiser ฉันสร้างปลั๊กอิน MU ต่อไปนี้ (ปรับจากความคิดเห็นเพราะ$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 เท่านั้นผลการอ่าน:

Array Dependencies ที่ลงทะเบียนแล้ว: yep
Dependencies ที่โหลดในส่วนท้าย: nope
The Dependencies ที่พิมพ์ไปยัง DOM: nope

ด้วย WooCommerce 2.2.8 บวกกับปลั๊กอิน "dummy" ใหม่ของฉันผลลัพธ์จะอ่านเหมือนกัน (ไม่ว่าจะโหลดสคริปต์ของฉันในส่วนท้ายหรือไม่):

Array Dependencies ที่ลงทะเบียนแล้ว: yep
Dependencies ที่โหลดในส่วนท้าย: nope
The Dependencies ที่พิมพ์ไปยัง DOM: nope

ปลั๊กอินจำลอง

ต่อความคิดเห็นต่อไปนี้เป็นปลั๊กอินจำลองเพื่อหวังว่าจะทำให้เกิดปัญหาแก่ผู้อื่น ฉันถอดฉันปลั๊กอินที่มีอยู่ทั้งหมดทางลงไปเพียงโหลดสคริปต์ในหน้าผู้ดูแลระบบโพสต์สินค้าชนิด ฉันยังคงเห็นการโหลด datepicker เมื่อ$in_footerเป็นเท็จและไม่โหลดเมื่อ$in_footerเป็นจริง

<?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เป็นความจริงในสคริปต์ของตัวเอง
helgatheviking

1
นี่ดูเหมือนข้อบกพร่องใน WP สำหรับฉัน - ฉันไม่ได้ติดตามตรรกะ แต่ถ้าคุณดูฟังก์ชันdo_itemsใน "wp-include / class.wp-dependencies.php" ที่บรรทัด 122-125 รหัสจะไม่ทำงาน รายการในรายการ to_do จะdo_itemสำเร็จหรือไม่ ถ้าคุณเปลี่ยนเส้นเหล่านั้นไปif ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }แล้วข้อผิดพลาดออกไป ...
Bonger

2
ปัญหานี้เป็นปัญหา WP - ดูTrac # ฉันเสนอแพทช์ (gitlost c'est moi)
bonger

@ bonger ขอบคุณสำหรับคำตอบที่ชัดเจน หากคุณต้องการที่จะย้ายความคิดเห็นของคุณไปยังคำตอบที่ฉันยอมรับมัน เห็นได้ชัดว่าการพึ่งพาเป็นนรก
helgatheviking

คำตอบ:


2

ขณะนี้คุณสามารถบังคับให้โหลดไลบรารีโดยใช้ wp_enqueue_script () เช่น:

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

ฉันรู้ว่ามันโหลดโดยอัตโนมัติ แต่ทำงานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.