Завантаження сценарію із залежністю - це вивантаження залежності іншого сценарію


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залежності, це також вирішує проблему

Отож, мені цікаво, чому завантаження мого сценарію у нижній колонтитул впливає на завантаження основного скрипта дата-вибору? (Я взагалі не використовую датчик у своєму сценарії.) Або чому відсутність сценарію Woo як залежності також вплине на скрипт Datepicker? Мені здається, що скрипт 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

Dummy Plugin

Крім коментарів, ось фіктивний плагін, який, сподіваємось, відтворив проблему для інших. Я позбавив свій існуючий плагін до кінця, щоб лише завантажити сценарій на сторінки адміністратора публікації типу публікації. Я все ще бачу завантаження датника, коли $in_footerце неправда, а не завантажує, коли $in_footerце правда.

<?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в "wp-include / class.wp-odvisnosti.php", у рядках 122-125, код просто скасовується елемент у списку to_do, do_itemуспішно чи ні . Якщо змінити ці рядки, if ( $this->do_item( $handle, $group ) ) { $this->done[] = $handle; unset( $this->to_do[$key] ); }то помилка піде ...
Бонґер

2
Це помилка WP - див. Trac # 25247 . Я запропонував патч (gitlost c'est moi).
Бонгер

@bonger Дякую за остаточну відповідь. Якщо ви хочете перенести ваш коментар у відповідь, я би прийняв його. Мабуть, залежності - це пекло.
helgatheviking

Відповіді:


2

Наразі ви можете змусити завантаження бібліотек за допомогою wp_enqueue_script (), наприклад:

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

Я знаю, що він повинен завантажуватися автоматично, але це працює саме так.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.