Carregando um script com uma dependência, está descarregando a dependência de outro script

9

Primeiramente, estou ciente de que minha pergunta está acontecendo no contexto do meu trabalho com o plug-in WooCommerce, o que normalmente faria com que ele ficasse fora do tópico. No entanto, eu penso que a minha pergunta se relaciona com wp_enqueue_script , por isso espero que ainda esteja no tópico.

Então o WooCommerce está registrando um script no gancho admin_enqueue_scripts . Este script requer um monte de dependências:

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

(ele é enfileirado especificamente na página post.php e post-new.php para o tipo de postagem do produto um pouco mais tarde no código)

No plug-in personalizado que estou escrevendo para trabalhar com o WooCommerce, também estou carregando um script no mesmo gancho.

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 eu enfileirar o script do meu plugin e definir o parâmetro $in_footer como true , então inexplicavelmente, o script jQuery UI Datepicker não será carregado (não estará no código-fonte) e o console mostrará os erros de script correspondentes.

Se eu carregar meu script no cabeçalho, isso não é um problema. Se eu carregar meu script sem a dependência wc-admin-meta-boxes , isso também resolve o problema

Então, o que eu estou querendo saber é: por que carregar meu script no rodapé afeta o carregamento do script core datepicker? (Eu não estou usando datepicker no meu script.) Ou por que não ter o script Woo como uma dependência também afetaria o script datepicker? Parece-me que o script datepicker deve ser carregado, não importa como uma dependência do script metabox Woo, mas isso não está acontecendo.

Por comentário do Kaiser, criei o seguinte plug-in de MU (ajustado de comentários porque $GLOBALS['wp_scripts'] é um 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;'; 
}

Com apenas o WooCommerce 2.2.8 ativo, o resultado é:

  

A matriz de dependências registrada: sim
  Dependências carregadas no rodapé: nope
  As Dependências impressas no DOM: nope

Com o WooCommerce 2.2.8 e o meu novo plugin "dummy", o resultado é o mesmo (quer meu script seja carregado no rodapé ou não):

  

A matriz de dependências registrada: sim
  Dependências carregadas no rodapé: nope
  As Dependências impressas no DOM: nope

Plug-in fictício

Também, de acordo com os comentários, aqui está um plug-in falso para, esperamos, reproduzir o problema para outras pessoas. Eu limpei meu plug-in existente até somente carregar um script nas páginas de administração do tipo de postagem do produto. Ainda estou vendo a carga do datepicker quando $in_footer é falso e não é carregado quando $in_footer é verdadeiro.

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

1 resposta

2

Atualmente, você pode forçar um carregamento para as Bibliotecas usando wp_enqueue_script (), da seguinte forma:

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

Eu sei que é necessário carregar automaticamente, mas funciona assim.

    
por Leo Caseiro 15.01.2015 / 04:31