Bağımlılığa sahip bir komut dosyası yüklemek, başka bir komut dosyasının bağımlılığını kaldırmaktır


9

İlk olarak, sorumun normalde konu dışı yapacak WooCommerce eklentisi ile yaptığım çalışma bağlamında gerçekleştiğinin farkındayım. Ancak, bence sorumla ilgili wp_enqueue_script, umarım hala konuyla ilgili.

WooCommerce admin_enqueue_scriptskancaya bir senaryo kaydediyor . Bu komut dosyası bir grup bağımlılık gerektirir:

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

(ürün postasının post.php ve post-new.php sayfasında özellikle kodda biraz sonra yazılır)

WooCommerce ile çalışmak için yazdığım özel eklentide aynı kancaya bir komut dosyası yüklüyorum.

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

Eklentimin komut dosyasını enqueue ve $in_footerparametre trueaçıklanamaz şekilde ayarlarsanız, jQuery UI Datepicker komut dosyası yüklenmez (kaynak kodunda hiç değil) ve konsol ilgili komut dosyası hatalarını gösterir.

Komut dosyasını başlığa yüklersem, bu bir sorun değildir. Senaryomu wc-admin-meta-boxesbağımlılık olmadan yüklersem , bu da sorunu çözer

Merak ediyorum, neden altyazıya komut dosyamı yüklemek çekirdek datepicker komut dosyasının yüklenmesini etkiliyor? (Senaryomda hiç datepicker kullanmıyorum.) Ya da neden Woo betiğinin bağımlılık yapmaması datepicker betiğini de etkiler? Bana öyle geliyor ki, Woo metabox betiğinin bağımlılığı ne olursa olsun, tarih seçici betiğin yüklenmesi gerekiyor, ancak bu gerçekleşmiyor.

Kaiser yorumu başına, aşağıdaki MU eklentisini oluşturdum ( $GLOBALS['wp_scripts']bir nesne olduğu için yorumlardan ayarlandı :

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

Yalnızca WooCommerce 2.2.8 etkinken, sonuç şu şekildedir:

Kayıtlı Bağımlılıklar Dizisi: evet
Altbilgiye yüklenen
Bağımlılıklar: hayır DOM'ye yazdırılan Bağımlılıklar: hayır

WooCommerce 2.2.8 artı yeni "kukla" eklentim ile sonuç aynı okunur (betiğim altbilgide yüklü olsun veya olmasın):

Kayıtlı Bağımlılıklar Dizisi: evet
Altbilgiye yüklenen
Bağımlılıklar: hayır DOM'ye yazdırılan Bağımlılıklar: hayır

Kukla Eklentisi

Ayrıca yorumlara göre, sorunu başkaları için yeniden üretmek için kukla bir eklenti. Ürün eki türü yönetici sayfalarına yalnızca bir komut dosyası yüklemek için mevcut eklentimi tamamen kaldırdım . Hala $in_footeryanlış olduğunda datepicker yük görüyorum ve $in_footerdoğru olduğunda yük değil .

<?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
Sadece merak. Altbilgide kuyruk oluştururken, komut dosyalarınızı WooCommerce komutunun üstünde veya altında kuyruğa alma işleminizin önceliğini ayarlamaya çalıştınız mı? Ben özdeş bağımlılıkları kullanarak eklentileri ile örneklere koştum ve her örneğinin kaydını sildim ve bir nedenle bu düzeltildi. (Fazla düşünmedim). Yine de üstbilgi ve altbilgi sıralaması arasında hiçbir fark olmadı.
BODA82

Diğer tüm yorumlara ne olduğunu merak ediyorum. Her neyse, @ BODA82, hayır bunu denememiştim. Ama öncelik ekleyerek yapar ne zaman doğru bile datepicker yükleme tutmak $in_footerkendi senaryo üzerinde doğrudur.
helgatheviking

1
Bu bana WP bir hata gibi görünüyor - mantığı takip etmedim ama do_items"wp-include / class.wp-dependsencies.php", 122-125 satırlarında , işleve bakarsanız , kod sadece unsets to_do listesindeki öğe do_itembaşarılı olsun ya da olmasın . Bu satırları değiştirirseniz if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }, hata gider ...
bonger

2
Bu bir WP hatası - bkz. Trac # 25247 . Bir yama önerdim (gitlost c'est moi).
bonger

@bonger Kesin cevap için teşekkürler. Yorumunuzu bir cevaba taşımak isterseniz, kabul ediyorum. Görünüşe göre, bağımlılıklar cehennemdir.
13'te helgatheviking

Yanıtlar:


2

Şu anda aşağıdaki gibi wp_enqueue_script () kullanarak Kütüphaneler için bir yüklemeyi zorlayabilirsiniz:

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

Yükü otomatik olarak salladığını biliyorum, ama bu şekilde çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.