加载带有依赖项的脚本,就是卸载另一个脚本的依赖项

时间:2014-11-17 作者:helgatheviking

首先,我知道我的问题发生在我使用WooCommerce插件的工作中,这通常会使它偏离主题。然而,我认为我的问题与wp_enqueue_script, 所以希望这仍然是个话题。

WooCommerce正在admin_enqueue_scripts 钩此脚本需要一系列依赖项:

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 );
(它在代码稍后的post.php和post-new.php页面上专门为产品post类型排队)

在我为与WooCommerce合作而编写的自定义插件中,我也在同一个挂钩上加载了一个脚本。

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 );
如果我将插件的脚本排队并设置$in_footer 参数到true 然后,令人费解的是,jQuery UI Datepicker脚本没有加载(根本不在源代码中),控制台显示了相应的脚本错误。

如果我在标题中加载脚本,这不是问题。如果加载脚本时没有wc-admin-meta-boxes 依赖性,那么这也解决了问题

所以我想知道的是,为什么在页脚中加载脚本会影响核心日期选择器脚本的加载?(我的脚本中根本没有使用datepicker。)或者为什么不将Woo脚本作为依赖项也会影响datepicker脚本?在我看来,无论作为Woo metabox脚本的依赖项如何,都应该加载datepicker脚本,但这并没有发生。

根据Kaiser的评论,我创建了以下MU插件(根据评论进行了调整,因为$GLOBALS[\'wp_scripts\'] 是一个对象:

/* 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;\'; 
}
只有WooCommerce 2.2.8处于活动状态时,结果显示:

注册的依赖项数组:是的
页脚中加载的依赖项:否
打印到DOM的依赖项:否

使用WooCommerce 2.2.8和我的新“虚拟”插件,结果是相同的(无论我的脚本是否加载在页脚中):

注册的依赖项数组:是的
页脚中加载的依赖项:否
打印到DOM的依赖项:否

Dummy Plugin

同样根据评论,这里有一个虚拟插件,希望能为其他人重现这个问题。我剥离了现有的插件,只在product post type管理页面上加载一个脚本。我仍然看到datepicker加载$in_footer 为false且在以下情况下不加载$in_footer 是真的。

<?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 个回复
SO网友:Leo Caseiro

当前,您可以使用wp\\u enqueue\\u script()强制加载库,如下所示:

wp_enqueue_script(\'jquery\');
wp_enqueue_script(\'jquery-ui\');
我知道它应该自动加载,但它是这样工作的。

结束

相关推荐