首先,我知道我的问题发生在我使用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页面上专门为产品post类型排队)
在我为与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。)或者为什么不将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处于活动状态时,结果显示:
注册的依赖项数组:是的
页脚中加载的依赖项:否
打印到DOM的依赖项:否
使用WooCommerce 2.2.8和我的新“虚拟”插件,结果是相同的(无论我的脚本是否加载在页脚中):
注册的依赖项数组:是的
页脚中加载的依赖项:否
打印到DOM的依赖项:否
Dummy Plugin
同样根据评论,这里有一个虚拟插件,希望能为其他人重现这个问题。我剥离了现有的插件,只在product post type管理页面上加载一个脚本。我仍然看到datepicker加载
$in_footer
为false且在以下情况下不加载
$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();