WordPress

Ładowanie skryptu z zależnością powoduje zwolnienie zależności innego skryptu

  • 17 listopada, 2014
  • 5 min read
Ładowanie skryptu z zależnością powoduje zwolnienie zależności innego skryptu


Po pierwsze, mam świadomość, że moje pytanie ma miejsce w kontekście mojej pracy z wtyczką WooCommerce, co zwykle sprawia, że ​​jest ono nie na temat. Jednakże, ja myśleć moje pytanie dotyczy wp_enqueue_scriptwięc mam nadzieję, że jest to nadal aktualne.

Zatem WooCommerce rejestruje skrypt na admin_enqueue_scripts hak. Ten skrypt wymaga szeregu zależności:

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

(jest umieszczany w kolejce specjalnie na stronach post.php i post-new.php dla typu postu o produkcie nieco później w kodzie)

W niestandardowej wtyczce, którą piszę do pracy z WooCommerce, ładuję również skrypt na tym samym haku.

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

Jeśli kolejkuję skrypt mojej wtyczki i ustawię plik $in_footer parametr do true wtedy w niewytłumaczalny sposób skrypt jQuery UI Datepicker nie jest ładowany (w ogóle nie znajduje się w kodzie źródłowym), a konsola wyświetla odpowiednie błędy skryptu.

Jeśli załaduję mój skrypt do nagłówka, nie stanowi to problemu. Jeśli załaduję mój skrypt bez pliku wc-admin-meta-boxes zależność, to również rozwiązuje problem

Warto przeczytać!  wp enqueue script - Ajax nie jest zdefiniowany

Zastanawiam się więc, dlaczego ładowanie mojego skryptu w stopce wpływa na ładowanie podstawowego skryptu datepicker? (W ogóle nie używam narzędzia datepicker w moim skrypcie). Albo dlaczego brak skryptu Woo jako zależności miałby również wpływ na skrypt datepicker? Wydaje mi się, że skrypt datepicker powinien zostać załadowany bez względu na zależność od skryptu metabox Woo, ale tak się nie dzieje.

Zgodnie z komentarzem Kaisera stworzyłem następującą wtyczkę MU (dostosowaną na podstawie komentarzy, ponieważ $GLOBALS['wp_scripts'] jest obiektem:

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

Przy aktywnym tylko WooCommerce 2.2.8 wynik brzmi:

Zarejestrowana tablica zależności: tak
Zależności załadowane w stopce: nie
Zależności wydrukowane w DOM: nie

W przypadku WooCommerce 2.2.8 i mojej nowej „fikcyjnej” wtyczki wynik jest taki sam (niezależnie od tego, czy mój skrypt jest załadowany w stopce, czy nie):

Zarejestrowana tablica zależności: tak
Zależności załadowane w stopce: nie
Zależności wydrukowane w DOM: nie

Fałszywa wtyczka

Warto przeczytać!  wtyczki - Wordpress: jak utworzyć onglet i go usunąć, gdy jest tylko jeden

Zgodnie z komentarzami, oto fikcyjna wtyczka, która, mam nadzieję, odtworzy problem dla innych. Pozbyłem się mojej istniejącej wtyczki aż do tylko załaduj skrypt na stronach administracyjnych typu post o produkcie. Nadal widzę ładowanie datepicker kiedy $in_footer ma wartość false i nie ładuje się, kiedy $in_footer jest prawdziwy.

<?php
/*
Plugin Name: WooCommerce Dummy Plugin
Plugin URI: 
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();


Źródło

Warto przeczytać!  php — Zastąpienie mysql_escape_string w niestandardowej wtyczce podczas przechodzenia na PHP7