依存関係を持つスクリプトをロードすると、別のスクリプトの依存関係がアンロードされます


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_footerパラメーターをtrue不可解に設定すると、jQuery UI Datepickerスクリプトが読み込まれず(ソースコードにはまったく含まれません)、対応するスクリプトエラーがコンソールに表示されます。

ヘッダーにスクリプトを読み込んでも問題ありません。wc-admin-meta-boxes依存関係なしでスクリプトをロードすると、問題も解決します

では、私が疑問に思っているのは、フッターにスクリプトを読み込むと、コアの日付ピッカースクリプトが読み込まれるのはなぜですか。(私はスクリプトでdatepickerをまったく使用していません。)または、Wooスクリプトを依存関係として持たないことがdatepickerスクリプトにも影響するのはなぜですか?Wooメタボックススクリプトの依存関係として、datepickerスクリプトをロードする必要があるように見えますが、これは発生していません。

カイザーのコメントに従って、私は次の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

ダミープラグイン

また、コメントごとに、うまくいけば他の人のために問題を再現するためのダミーのプラグインがあります。私は既存のプラグインを完全に削除して、製品投稿タイプの管理ページにスクリプトをロードするだけにしました。$in_footerがfalseの場合はdatepickerのロードが引き続き表示され、$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、いや、私はそれを試していませんでした。しかし、優先順位を追加する場合でも、正しく日付ピッカーロードを保つ$in_footer自分のスクリプトに真です。
helgatheviking 2014年

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のバグです-trac#25247を参照してください。パッチを提案しました(gitlost c'est moi)。
面白かった14

@bonger決定的な答えをありがとう。コメントを回答に移動したい場合は、それを受け入れます。どうやら、依存関係は地獄です。
helgatheviking 2014

回答:


2

現在、次のようにwp_enqueue_script()を使用してライブラリを強制的にロードできます。

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

自動的にロードされることはわかっていますが、そのように動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.