Đầu tiên, tôi biết rằng câu hỏi của tôi đang xảy ra trong bối cảnh công việc của tôi với plugin WooC Commerce, thông thường sẽ khiến nó lạc đề. Tuy nhiên, tôi nghĩ rằng câu hỏi của tôi liên quan đến wp_enqueue_script
, vì vậy hy vọng nó vẫn còn trong chủ đề.
Vì vậy, WooC Commerce đang đăng ký một tập lệnh trên admin_enqueue_scripts
hook. Kịch bản này đòi hỏi một loạt các phụ thuộc:
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 );
(nó được ghi rõ cụ thể trên trang post.php và post-new.php cho loại bài đăng sản phẩm một lát sau trong mã)
Trong plugin tùy chỉnh mà tôi đang viết để làm việc với WooC Commerce, tôi cũng đang tải một tập lệnh trên cùng một hook.
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 );
Nếu tôi xử lý tập lệnh của plugin và đặt $in_footer
tham số thành true
không thể giải thích được, tập lệnh Datepicker của UI UI không được tải (hoàn toàn không phải trong mã nguồn) và bảng điều khiển hiển thị các lỗi tập lệnh tương ứng.
Nếu tôi tải tập lệnh của mình trong tiêu đề, đây không phải là vấn đề. Nếu tôi tải tập lệnh của mình mà không wc-admin-meta-boxes
phụ thuộc thì điều đó cũng giải quyết được vấn đề
Vì vậy, điều tôi băn khoăn là, tại sao việc tải tập lệnh của tôi trong phần chân trang lại ảnh hưởng đến việc tải tập lệnh datepicker cốt lõi? (Tôi hoàn toàn không sử dụng datepicker trong tập lệnh của mình.) Hoặc tại sao không có tập lệnh Woo làm phụ thuộc cũng sẽ ảnh hưởng đến tập lệnh datepicker? Dường như với tôi rằng tập lệnh datepicker nên được tải bất kể là phụ thuộc của tập lệnh metabox Woo, nhưng điều này không xảy ra.
Theo nhận xét của Kaiser, tôi đã tạo plugin MU sau (được điều chỉnh từ nhận xét vì $GLOBALS['wp_scripts']
là một đối tượng:
/* 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…';
}
Chỉ với WooC Commerce 2.2.8 hoạt động, kết quả sẽ ghi:
Mảng phụ thuộc đã đăng ký: yep
Các phụ thuộc được tải trong phần chân trang: nope
Các phụ thuộc được in vào DOM: nope
Với WooC Commerce 2.2.8 cộng với plugin "giả" mới của tôi, kết quả sẽ đọc tương tự (cho dù tập lệnh của tôi có được tải ở chân trang hay không):
Mảng phụ thuộc đã đăng ký: yep
Các phụ thuộc được tải trong phần chân trang: nope
Các phụ thuộc được in vào DOM: nope
Plugin giả
Cũng theo các bình luận, đây là một plugin giả để hy vọng tái tạo vấn đề cho người khác. Tôi đã gỡ bỏ plugin hiện tại của mình xuống chỉ để tải tập lệnh trên các trang quản trị loại bài đăng sản phẩm. Tôi vẫn thấy tải ngày tháng khi $in_footer
sai và không tải khi $in_footer
đúng.
<?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
đúng với tập lệnh của riêng tôi.
do_items
trong "wp-gồm / class.wp-Depencies.php", tại các dòng 122-125, mã chỉ bỏ cài đặt mục trong danh sách to_do có do_item
thành công hay không . Nếu bạn thay đổi những dòng if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }
đó thì lỗi sẽ biến mất ...