首先,我知道我的问题是在使用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脚本?在我看来,无论Woo metabox脚本的依赖项如何,都应加载datepicker脚本,但这没有发生。
根据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的情况下,结果为:
已注册的依存关系数组:yep
在页脚中加载的依存关系:nope
打印到DOM的依存关系:nope
使用WooCommerce 2.2.8和我的新“虚拟”插件时,结果读取相同(无论我的脚本是否已加载到页脚中):
已注册的依存关系数组:yep
在页脚中加载的依存关系:nope
打印到DOM的依存关系:nope
虚拟插件
此外,根据评论,这是一个虚拟插件,希望可以重现此问题。我彻底删除了现有插件,仅在产品发布类型管理页面上加载脚本。我仍然看到datepicker在$in_footer
false 时加载,而在$in_footer
true 时不加载。
<?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-includes / class.wp-dependencies.php”中的功能,在第122-125行,则代码未设置to_do列表中的项目是否do_item
成功。如果您将这些行更改为,if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }
则该错误将消失……