加载具有依赖性的脚本就是卸载另一个脚本的依赖性


9

首先,我知道我的问题是在使用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页面上,用于产品发布类型)

在我编写的用于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_footertrue然后将参数设置为,则无法解释,则不会加载jQuery UI Datepicker脚本(根本不在源代码中),并且控制台会显示相应的脚本错误。

如果我将脚本加载到标题中,这不是问题。如果我在没有wc-admin-meta-boxes依赖项的情况下加载脚本,那也可以解决问题

所以我想知道的是,为什么在页脚中加载我的脚本会影响核心datepicker脚本的加载?(我根本不在脚本中使用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的情况下,结果为:

已注册的依存关系数组:yep
在页脚中加载的依存关系:nope
打印到DOM的依存关系:nope

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

已注册的依存关系数组:yep
在页脚中加载的依存关系:nope
打印到DOM的依存关系:nope

虚拟插件

此外,根据评论,这是一个虚拟插件,希望可以重现此问题。我彻底删除了现有插件,在产品发布类型管理页面上加载脚本。我仍然看到datepicker在$in_footerfalse 时加载,而在$in_footertrue 时不加载。

<?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
只是好奇。在页脚中排队时,您是否尝试过将队列中的脚本设置为高于或低于WooCommerce的优先级?我遇到了使用相同依赖项的插件实例,并且它注销了它的每个实例,由于某种原因,它对此进行了修复。(我没有想太多)。但是,在页眉和页脚中排队从来没有什么区别。
BODA82 2014年

我想知道其他所有评论怎么了?无论如何,@ BODA82,不,我没有尝试过。但是,即使在我自己的脚本中为true 时,添加优先级也可以使datepicker正确加载$in_footer
helgatheviking

1
对我来说,这似乎是WP中的一个错误-我没有遵循逻辑,但是如果您查看do_items“ wp-includes / class.wp-dependencies.php”中的功能,在第122-125行,则代码未设置to_do列表中的项目是否do_item成功。如果您将这些行更改为,if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }则该错误将消失……
bonger 2014年

2
这是一个WP错误-请参阅跟踪#25247。我提出了一个补丁(gitlost c'est moi)。
bonger 2014年

@bonger感谢您的明确答案。如果您想将评论移至答案,我会接受。显然,依赖关系是地狱。
helgatheviking 2014年

Answers:


2

当前,您可以使用wp_enqueue_script()强制对库进行加载,如下所示:

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

我知道它应该自动加载,但是它可以那样工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.