Innanzitutto, sono consapevole che la mia domanda si sta verificando nel contesto del mio lavoro con il plug-in WooCommerce, che normalmente lo renderebbe fuori tema. Tuttavia, penso che la mia domanda si riferisca wp_enqueue_script
, quindi spero che sia ancora in discussione.
Quindi WooCommerce sta registrando uno script admin_enqueue_scripts
all'amo. Questo script richiede un sacco di dipendenze:
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 );
(è accodato specificamente sulla pagina post.php e post-new.php per il tipo di post di prodotto un po 'più avanti nel codice)
Nel plugin personalizzato che sto scrivendo per lavorare con WooCommerce sto anche caricando uno script sullo stesso hook.
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 );
Se accoda lo script del mio plugin e imposto il $in_footer
parametro su true
inspiegabilmente, lo script Datepicker dell'interfaccia utente jQuery non viene caricato (non nel codice sorgente) e la console mostra gli errori di script corrispondenti.
Se carico il mio script nell'intestazione, questo non è un problema. Se carico il mio script senza la wc-admin-meta-boxes
dipendenza, anche questo risolve il problema
Quindi quello che mi chiedo è: perché caricare il mio script nel piè di pagina ha effetto sul caricamento dello script principale di Datepicker? (Non uso affatto datepicker nel mio script.) O perché non avere lo script Woo come dipendenza avrebbe effetto anche sullo script datepicker? Mi sembra che lo script datepicker debba essere caricato indipendentemente dalla dipendenza dello script metabox di Woo, ma questo non sta accadendo.
Per il commento di Kaiser, ho creato il seguente plugin MU (modificato dai commenti perché $GLOBALS['wp_scripts']
è un oggetto:
/* 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…';
}
Con solo WooCommerce 2.2.8 attivo, il risultato è:
Matrice delle dipendenze registrata: sì
Le dipendenze caricate nel piè di pagina: no
Le dipendenze stampate sul DOM: no
Con WooCommerce 2.2.8 e il mio nuovo plugin "fittizio" il risultato è lo stesso (indipendentemente dal fatto che il mio script sia caricato nel piè di pagina):
Matrice delle dipendenze registrata: sì
Le dipendenze caricate nel piè di pagina: no
Le dipendenze stampate sul DOM: no
Plugin fittizio
Anche per i commenti, ecco un plugin fittizio per spero di riprodurre il problema per gli altri. Ho rimosso completamente il mio plug-in esistente per caricare solo uno script nelle pagine di amministrazione del tipo di post prodotto. Sto ancora vedendo caricare datepicker quando $in_footer
è falso e non caricare quando $in_footer
è vero.
<?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
è vero il mio proprio script.
do_items
in "wp-Includes / class.wp-dependencies.php", alle righe 122-125, il codice si disattiva l'elemento nell'elenco to_do ha esito positivo o meno do_item
. Se cambi queste righe in if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }
allora il bug scompare ...