Cargando una secuencia de comandos con una dependencia, está descargando la dependencia de otra secuencia de comandos

9

Primero, soy consciente de que mi pregunta está ocurriendo en el contexto de mi trabajo con el complemento WooCommerce, que normalmente lo haría fuera de tema. Sin embargo, pienso mi pregunta se relaciona con wp_enqueue_script , así que espero que todavía esté en el tema.

Así que WooCommerce está registrando un script en el gancho admin_enqueue_scripts . Este script requiere un montón de dependencias:

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

(se pone en cola específicamente en las páginas post.php y post-new.php para el tipo de publicación del producto un poco más adelante en el código)

En el complemento personalizado que estoy escribiendo para trabajar con WooCommerce también estoy cargando un script en el mismo enlace.

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 encolaré la secuencia de comandos de mi complemento y estableceré el parámetro $in_footer en true , entonces, de manera inexplicable, la secuencia de comandos jQuery UI Datepicker no se cargará (no estará en el código fuente) y la consola mostrará los errores correspondientes.

Si carga mi script en el encabezado, esto no es un problema. Si cargo mi script sin la dependencia wc-admin-meta-boxes , eso también resuelve el problema

Entonces, lo que me pregunto es ¿por qué cargar mi script en el pie de página afecta la carga del script central de selección de fechas? (No estoy usando datepicker en mi script). ¿O por qué no tener el script Woo como una dependencia también afectaría el script datepicker? Me parece que el script datepicker debería cargarse sin importar qué dependa del script metabox Woo, pero esto no está sucediendo.

Según el comentario de Kaiser, creé el siguiente complemento MU (ajustado a partir de los comentarios porque $GLOBALS['wp_scripts'] es un objeto:

/* 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 activo, el resultado se lee:

  

La matriz de dependencias registradas: yep
  Las Dependencias cargadas en el pie de página: nop
  Las dependencias impresas en el DOM: nope

Con WooCommerce 2.2.8 más mi nuevo complemento "ficticio", el resultado se lee igual (independientemente de que mi script esté cargado en el pie de página):

  

La matriz de dependencias registradas: yep
  Las Dependencias cargadas en el pie de página: nop
  Las dependencias impresas en el DOM: nope

Complemento ficticio

También por los comentarios, aquí hay un complemento ficticio para reproducir el problema para otros. Desplegué mi complemento existente hasta solo cargar un script en las páginas de administración de tipo de producto. Todavía estoy viendo la carga del selector de fecha cuando $in_footer es falso y no se carga cuando $in_footer es verdadero.

<?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();
    
pregunta helgatheviking 17.11.2014 - 20:08

1 respuesta

2

Actualmente puedes forzar una carga para las bibliotecas usando wp_enqueue_script (), de esta forma:

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

Sé que debería cargarse automáticamente, pero funciona de esa manera.

    
respondido por el Leo Caseiro 15.01.2015 - 04:31

Lea otras preguntas en las etiquetas