종속성이있는 스크립트를로드하면 다른 스크립트의 종속성이 언로드됩니다.


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 메타 박스 스크립트의 종속 관계에 관계없이로드되어야하지만 이것은 일어나지 않습니다.

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

더미 플러그인

또한 의견에 따라 다른 사람들의 문제를 희망적으로 재현하는 더미 플러그인이 있습니다. 제품 게시 유형 관리 페이지에 스크립트 로드하기 위해 기존 플러그인을 완전히 제거했습니다 . 여전히 $in_footerfalse 일 때 datepicker로드 $in_footer가 표시되고 true 일 때는로드되지 않습니다 .

<?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

다른 모든 의견에 어떤 일이 있었는지 궁금합니다. 어쨌든, @ BODA82, 아니, 나는 그것을 시도하지 않았습니다. 그러나 우선 순위를 추가하면 수행 할 때 제대로 심지어 날짜 선택기 로딩을 계속 $in_footer내 자신의 스크립트에 대한 사실이다.
helgatheviking

1
이것은 WP의 버그처럼 보입니다. 나는 논리를 do_items따르지 않았지만 12-125 행에서 "wp-includes / class.wp-dependencies.php" 의 함수를 보면 코드가 설정 해제됩니다. do_item성공 여부에 대한 to_do 목록의 항목 이 줄을 바꾸면 if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }버그가 사라집니다.
bonger

2
이것은 WP 버그 입니다. trac # 25247을 참조하십시오 . 나는 패치 (gitlost c'est moi)를 제안했다.
bonger

@bonger 확실한 답변에 감사드립니다. 귀하의 의견을 답변으로 옮기고 싶다면 동의합니다. 분명히, 의존성은 지옥입니다.
helgatheviking

답변:


2

현재 다음과 같이 wp_enqueue_script ()를 사용하여 라이브러리를 강제로로드 할 수 있습니다.

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

나는 그것이 자동으로로드되어야한다는 것을 알고 있지만 그렇게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.