Caricare uno script con una dipendenza, sta scaricando la dipendenza di un altro script


9

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_scriptsall'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_footerparametro su trueinspiegabilmente, 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-boxesdipendenza, 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&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;'; 
}

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&#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();

1
Solo curioso. Hai tentato di impostare la priorità della tua azione mettendo in coda gli script sopra o sotto a quello di WooCommerce durante la coda nel piè di pagina? Mi sono imbattuto in istanze con plug-in usando dipendenze identiche e ne ha cancellato ogni istanza, e per qualche motivo questo ha risolto il problema. (Non ci ho pensato molto). Tuttavia, non ho mai fatto differenza tra la coda nell'intestazione e il piè di pagina.
BODA82,

Mi chiedo cosa sia successo a tutti gli altri commenti? Comunque, @ BODA82, no, non ci avevo provato. Ma l'aggiunta di una priorità lo fa tenere datepicker carico correttamente anche quando $in_footerè vero il mio proprio script.
Helgatheviking

1
A me sembra un bug in WP - non ho seguito la logica ma se guardi la funzione do_itemsin "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 ...
bonger

2
Questo è un bug WP - vedi trac # 25247 . Ho proposto una patch (gitlost c'est moi).
bonger,

@bonger Grazie per la risposta definitiva. Se volessi spostare il tuo commento in una risposta, lo accetterei. Apparentemente, le dipendenze sono un inferno.
Helgatheviking,

Risposte:


2

Attualmente puoi forzare un caricamento per le Librerie usando wp_enqueue_script (), in questo modo:

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

So che dovrebbe caricarsi automaticamente, ma funziona in questo modo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.