web-dev-qa-db-fra.com

Charger un script avec une dépendance, décharger la dépendance d'un autre script

Premièrement, je suis conscient du fait que ma question se pose dans le cadre de mon travail avec le plugin WooCommerce, ce qui le ferait normalement hors sujet. Cependant, je pense ma question concerne wp_enqueue_script, alors espérons-le toujours dans le sujet.

Donc, WooCommerce enregistre un script sur le hook admin_enqueue_scripts. Ce script nécessite de nombreuses dépendances:

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 );

(il est mis en file d'attente spécifiquement sur les pages post.php et post-new.php pour le type de produit, un peu plus tard dans le code)

Dans le plug-in personnalisé que j'écris pour travailler avec WooCommerce, je charge également un script sur le même 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 );

Si je mets en file d'attente le script de mon plug-in et que le paramètre $in_footer est défini sur true, alors inexplicablement, le script DateQuery de l'interface utilisateur jQuery n'est pas chargé (pas du tout dans le code source) et la console affiche les erreurs de script correspondantes.

Si je charge mon script dans l'en-tête, ce n'est pas un problème. Si je charge mon script sans la dépendance wc-admin-meta-boxes, le problème est alors résolu

Je me demande donc pourquoi le chargement de mon script dans le pied de page affecte le chargement du script de base datepicker. (Je n'utilise pas du tout datepicker dans mon script.) Ou pourquoi ne pas avoir le script Woo comme dépendance affecterait également le script datepicker? Il me semble que le script datepicker devrait être chargé quelle que soit la dépendance du script métabox Woo, mais cela ne se produit pas.

Selon le commentaire de Kaiser, j'ai créé le plug-in MU suivant (corrigé des commentaires, car $GLOBALS['wp_scripts'] est un objet:

/* 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&hellip;?<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&hellip;'; 
}

Avec seulement WooCommerce 2.2.8 actif, le résultat est le suivant:

Le tableau des dépendances enregistrées: oui
Les dépendances chargées dans le pied de page: Nope
Les dépendances imprimées dans le DOM: non

Avec WooCommerce 2.2.8 et mon nouveau plug-in "factice", le résultat est identique (que mon script soit chargé dans le pied de page ou non):

Le tableau des dépendances enregistrées: oui
Les dépendances chargées dans le pied de page: Nope
Les dépendances imprimées dans le DOM: non

Dummy Plugin

Toujours selon les commentaires, voici un plug-in factice pour reproduire, espérons-le, le problème pour les autres. J'ai dépouillé mon plugin existant jusqu’à only charger un script sur les pages d’administration du type article. Je vois encore le chargement de datepicker quand $in_footer est faux et pas charger quand $in_footer est vrai.

<?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&#8217; huh?' ) );
    }


    /**
     * Unserializing instances of this class is forbidden.
     */
    public function __wakeup() {
        _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; 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();
9
helgatheviking

Actuellement, vous pouvez forcer le chargement des bibliothèques à l'aide de wp_enqueue_script (), comme suit:

wp_enqueue_script('jquery');
wp_enqueue_script('jquery-ui');

Je sais que ça devrait charger automatiquement, mais ça marche comme ça.

2
Leo Caseiro