まず、私の質問が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をまったく使用していません。)または、Wooスクリプトを依存関係として持たないことがdatepickerスクリプトにも影響するのはなぜですか?Wooメタボックススクリプトの依存関係として、datepickerスクリプトをロードする必要があるように見えますが、これは発生していません。
カイザーのコメントに従って、私は次の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
ダミープラグイン
また、コメントごとに、うまくいけば他の人のために問題を再現するためのダミーのプラグインがあります。私は既存のプラグインを完全に削除して、製品投稿タイプの管理ページにスクリプトをロードするだけにしました。$in_footer
がfalseの場合はdatepickerのロードが引き続き表示され、$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] ); }
、バグは解消されます...