Erstens ist mir bewusst, dass meine Frage im Zusammenhang mit meiner Arbeit mit dem WooCommerce-Plugin gestellt wird, was normalerweise zum Thema führen würde. Ich denke jedoch, meine Frage bezieht sich auf wp_enqueue_script
, also ist sie hoffentlich immer noch zum Thema.
WooCommerce registriert also ein Skript am admin_enqueue_scripts
Haken. Dieses Skript erfordert eine Reihe von Abhängigkeiten:
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 );
(Es wird speziell auf der Seite post.php und post-new.php für den Produktposttyp etwas später im Code in die Warteschlange gestellt.)
In dem benutzerdefinierten Plugin, das ich für die Arbeit mit WooCommerce schreibe, lade ich auch ein Skript auf denselben 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 );
Wenn ich das Skript meines Plugins in die Warteschlange stelle und den $in_footer
Parameter true
unerklärlicherweise auf dann setze , wird das jQuery UI Datepicker-Skript nicht geladen (überhaupt nicht im Quellcode) und die Konsole zeigt entsprechende Skriptfehler an.
Wenn ich mein Skript in den Header lade, ist dies kein Problem. Wenn ich mein Skript ohne wc-admin-meta-boxes
Abhängigkeit lade , wird das Problem dadurch ebenfalls behoben
Ich frage mich also, warum das Laden meines Skripts in der Fußzeile das Laden des zentralen Datepicker-Skripts beeinflusst. (Ich verwende Datepicker überhaupt nicht in meinem Skript.) Oder warum würde das Woo-Skript nicht als Abhängigkeit auch das Datepicker-Skript beeinflussen? Es scheint mir, dass das Datepicker-Skript geladen werden sollte, unabhängig von der Abhängigkeit des Woo-Metabox-Skripts, aber dies geschieht nicht.
Per Kaisers Kommentar habe ich das folgende MU-Plugin erstellt (angepasst aus Kommentaren, da $GLOBALS['wp_scripts']
es sich um ein Objekt handelt:
/* 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…';
}
Wenn nur WooCommerce 2.2.8 aktiv ist, lautet das Ergebnis:
Das registrierte Abhängigkeitsarray: yep
Die in die Fußzeile geladenen
Abhängigkeiten : nope Die im DOM gedruckten Abhängigkeiten: nope
Mit WooCommerce 2.2.8 und meinem neuen "Dummy" -Plugin lautet das Ergebnis dasselbe (unabhängig davon, ob mein Skript in die Fußzeile geladen ist oder nicht):
Das registrierte Abhängigkeitsarray: yep
Die in die Fußzeile geladenen
Abhängigkeiten : nope Die im DOM gedruckten Abhängigkeiten: nope
Dummy Plugin
In den Kommentaren finden Sie auch ein Dummy-Plugin, mit dem Sie das Problem hoffentlich für andere reproduzieren können. Ich habe mein vorhandenes Plugin vollständig entfernt, um nur ein Skript auf den Administrationsseiten des Produktposttyps zu laden. Ich sehe immer noch, wie der Datepicker geladen wird, wenn er $in_footer
falsch ist, und nicht, wenn er $in_footer
wahr ist.
<?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
dies in meinem eigenen Skript der Fall ist.
do_items
durchgearbeitet, aber wenn Sie sich die Funktion in "wp-includes / class.wp-dependencies.php" in den Zeilen 122-125 ansehen, wird der Code einfach deaktiviert das Element in der to_do-Liste, ob es erfolgreich ist oder nicht do_item
. Wenn Sie diese Zeilen ändern, if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }