Tải một tập lệnh với một phụ thuộc, là dỡ bỏ phụ thuộc của tập lệnh khác


9

Đầu tiên, tôi biết rằng câu hỏi của tôi đang xảy ra trong bối cảnh công việc của tôi với plugin WooC Commerce, thông thường sẽ khiến nó lạc đề. Tuy nhiên, tôi nghĩ rằng câu hỏi của tôi liên quan đến wp_enqueue_script, vì vậy hy vọng nó vẫn còn trong chủ đề.

Vì vậy, WooC Commerce đang đăng ký một tập lệnh trên admin_enqueue_scriptshook. Kịch bản này đòi hỏi một loạt các phụ thuộc:

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

(nó được ghi rõ cụ thể trên trang post.php và post-new.php cho loại bài đăng sản phẩm một lát sau trong mã)

Trong plugin tùy chỉnh mà tôi đang viết để làm việc với WooC Commerce, tôi cũng đang tải một tập lệnh trên cùng một hook.

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

Nếu tôi xử lý tập lệnh của plugin và đặt $in_footertham số thành truekhông thể giải thích được, tập lệnh Datepicker của UI UI không được tải (hoàn toàn không phải trong mã nguồn) và bảng điều khiển hiển thị các lỗi tập lệnh tương ứng.

Nếu tôi tải tập lệnh của mình trong tiêu đề, đây không phải là vấn đề. Nếu tôi tải tập lệnh của mình mà không wc-admin-meta-boxesphụ thuộc thì điều đó cũng giải quyết được vấn đề

Vì vậy, điều tôi băn khoăn là, tại sao việc tải tập lệnh của tôi trong phần chân trang lại ảnh hưởng đến việc tải tập lệnh datepicker cốt lõi? (Tôi hoàn toàn không sử dụng datepicker trong tập lệnh của mình.) Hoặc tại sao không có tập lệnh Woo làm phụ thuộc cũng sẽ ảnh hưởng đến tập lệnh datepicker? Dường như với tôi rằng tập lệnh datepicker nên được tải bất kể là phụ thuộc của tập lệnh metabox Woo, nhưng điều này không xảy ra.

Theo nhận xét của Kaiser, tôi đã tạo plugin MU sau (được điều chỉnh từ nhận xét vì $GLOBALS['wp_scripts']là một đối tượng:

/* 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;'; 
}

Chỉ với WooC Commerce 2.2.8 hoạt động, kết quả sẽ ghi:

Mảng phụ thuộc đã đăng ký: yep
Các phụ thuộc được tải trong phần chân trang: nope
Các phụ thuộc được in vào DOM: nope

Với WooC Commerce 2.2.8 cộng với plugin "giả" mới của tôi, kết quả sẽ đọc tương tự (cho dù tập lệnh của tôi có được tải ở chân trang hay không):

Mảng phụ thuộc đã đăng ký: yep
Các phụ thuộc được tải trong phần chân trang: nope
Các phụ thuộc được in vào DOM: nope

Plugin giả

Cũng theo các bình luận, đây là một plugin giả để hy vọng tái tạo vấn đề cho người khác. Tôi đã gỡ bỏ plugin hiện tại của mình xuống chỉ để tải tập lệnh trên các trang quản trị loại bài đăng sản phẩm. Tôi vẫn thấy tải ngày tháng khi $in_footersai và không tải khi $in_footerđúng.

<?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
Chỉ tò mò thôi. Bạn đã cố gắng đặt mức độ ưu tiên của hành động xếp hàng các tập lệnh của mình ở trên hoặc dưới mức của WooC Commerce khi xếp hàng ở chân trang chưa? Tôi đã chạy vào các phiên bản với các plugin sử dụng các phụ thuộc giống hệt nhau và nó hủy đăng ký mọi phiên bản của nó và vì một lý do nào đó, nó đã sửa nó. (Tôi đã không suy nghĩ nhiều). Không bao giờ tạo ra sự khác biệt giữa việc xếp hàng trong tiêu đề so với chân trang.
BODA82

Tôi tự hỏi điều gì đã xảy ra với tất cả các ý kiến ​​khác? Dù sao, @ BODA82, không, tôi đã không thử điều đó. Nhưng việc thêm mức độ ưu tiên sẽ giúp tải ngày tháng chính xác ngay cả khi điều đó $in_footerđúng với tập lệnh của riêng tôi.
xe đạp vào

1
Điều này có vẻ như là một lỗi trong WP đối với tôi - Tôi đã không tuân theo logic nhưng nếu bạn nhìn vào hàm do_itemstrong "wp-gồm / class.wp-Depencies.php", tại các dòng 122-125, mã chỉ bỏ cài đặt mục trong danh sách to_do có do_itemthành công hay không . Nếu bạn thay đổi những dòng if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }đó thì lỗi sẽ biến mất ...
bonger

2
Đây là một lỗi WP - xem trac # 25247 . Tôi đã đề xuất một bản vá (gitlost c'est moi).
bonger

@bonger Cảm ơn câu trả lời dứt khoát. Nếu bạn muốn chuyển bình luận của mình thành câu trả lời, tôi chấp nhận nó. Rõ ràng, sự phụ thuộc là địa ngục.
xe đạp

Câu trả lời:


2

Hiện tại bạn có thể buộc tải Thư viện bằng wp_enqueue_script (), như vậy:

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

Tôi biết nó sẽ tự động tải, nhưng nó hoạt động theo cách đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.