ครั้งแรกฉันรู้ว่าคำถามของฉันเกิดขึ้นในบริบทของงานของฉันกับปลั๊กอิน 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…?<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…';
}
เมื่อเปิดใช้งาน 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’ huh?' ) );
}
/**
* Unserializing instances of this class is forbidden.
*/
public function __wakeup() {
_doing_it_wrong( __FUNCTION__, __( 'Cheatin’ 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();
$in_footer
เป็นความจริงในสคริปต์ของตัวเอง
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] ); }
แล้วข้อผิดพลาดออกไป ...