첫째, 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 메타 박스 스크립트의 종속 관계에 관계없이로드되어야하지만 이것은 일어나지 않습니다.
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
더미 플러그인
또한 의견에 따라 다른 사람들의 문제를 희망적으로 재현하는 더미 플러그인이 있습니다. 제품 게시 유형 관리 페이지에 스크립트 만 로드하기 위해 기존 플러그인을 완전히 제거했습니다 . 여전히 $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
따르지 않았지만 12-125 행에서 "wp-includes / class.wp-dependencies.php" 의 함수를 보면 코드가 설정 해제됩니다. do_item
성공 여부에 대한 to_do 목록의 항목 이 줄을 바꾸면 if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }
버그가 사라집니다.