По-перше, я знаю, що моє запитання відбувається в контексті моєї роботи з плагіном 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
залежності, це також вирішує проблему
Отож, мені цікаво, чому завантаження мого сценарію у нижній колонтитул впливає на завантаження основного скрипта дата-вибору? (Я взагалі не використовую датчик у своєму сценарії.) Або чому відсутність сценарію Woo як залежності також вплине на скрипт Datepicker? Мені здається, що скрипт 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
Dummy Plugin
Крім коментарів, ось фіктивний плагін, який, сподіваємось, відтворив проблему для інших. Я позбавив свій існуючий плагін до кінця, щоб лише завантажити сценарій на сторінки адміністратора публікації типу публікації. Я все ще бачу завантаження датника, коли $in_footer
це неправда, а не завантажує, коли $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();
$in_footer
це відповідає моєму власному сценарію.
do_items
в "wp-include / class.wp-odvisnosti.php", у рядках 122-125, код просто скасовується елемент у списку to_do, do_item
успішно чи ні . Якщо змінити ці рядки, if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }
то помилка піде ...