Caricamento/Scaricamento Script in WordPress -- wp_deregister_script('jquery')

3 lug 2014, 10:20:22
Visualizzazioni: 15.4K
Voti: 2

Ho alcune domande relative al caricamento/scaricamento degli strumenti JavaScript in WordPress. Dopo aver letto una risposta ben scritta a una domanda di Pieter Goosen, ho approfondito l'argomento e ripulito il codice che uso per caricare le mie librerie. Questo codice proviene dal file function.php del mio child-theme. Sul mio sito ho alcune funzioni che utilizzano gli strumenti del calendario datepicker. Inoltre, ci sono alcuni plugin che sicuramente usano jQuery.

function jquery_loadup() {
        //wp_deregister_script('jquery');    <--- ?H
        wp_enqueue_script('jquery');
        //wp_enqueue_script('jquery-migrate');
        wp_enqueue_script('jquery-ui-core');
        wp_enqueue_script('jquery-ui-datepicker');
        wp_enqueue_style('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css');
}
add_action('wp_enqueue_scripts','jquery_loadup');

Avevo l'impressione che la riga wp_deregister_script('jquery') sostanzialmente resettasse/eliminasse tutte le precedenti "richieste" per gli script jQuery in modo che non interferissero tra loro. Quella riga seguita da wp_enqueue_script('jquery'); dovrebbe risultare in un caricamento pulito e minimale di jQuery tramite il sistema di handle/path degli script comunemente usati in WordPress, no? Pensavo che la chiamata deregister verificasse la presenza di un'installazione precedente di jQuery e, se ne trova una o più, ne interrompa il caricamento, se nessuna è registrata, non faccia nulla.

Quello che vedo è che quando uso wp_deregister_script('jquery') ottengo un errore sul sito "ReferenceError: jQuery is not defined". Quando ciò accade, tutte le mie funzioni JavaScript falliscono. Che diavolo succede? Quando è commentata, il sito funziona bene.

Domande: Mi sto perdendo qualcosa? Cosa non sto capendo della chiamata deregister? Perché otterrei un messaggio di errore?

Nota: la riga per jquery-migrate è pensata per software che usa versioni più vecchie di jQuery. L'ho testata, ma non vedo che faccia qualcosa sul mio sito, quindi l'ho rimossa per migliorare i tempi di download e risposta. Domanda: È una cattiva idea?

riferimenti:

2
Commenti

wp_deregister significa che stai annullando la registrazione di 'jquery'. Quindi quando chiami 'jquery' con wp_enqueue_script('jquery'), WordPress non riesce a trovare jquery, perché l'hai già deregistrato. Di conseguenza, anche la tua applicazione che necessita di jQuery fallirà.

ucon89 ucon89
3 lug 2014 10:41:34

Eh? Oh... ora capisco... ha perfettamente senso. Questo azzera lo scope di jquery ora definito dal sistema WordPress. Nessuno vuole incasinare questo aspetto. Ma aspetta... come fa WordPress a sapere come fermare il caos lasciato da 8 plugin diversi che cercano tutti di aggiungere versioni diverse di jquery? Inoltre, rispondi pure alla domanda così posso votarti positivamente?

zipzit zipzit
3 lug 2014 10:53:12
Tutte le risposte alla domanda 2
2

WordPress ha essenzialmente due gruppi di metodi per gestire gli script, entrambi dovrebbero essere utilizzati:

  • wp_register_script Registra uno script in WordPress. Non viene chiamato, è semplicemente reso disponibile per WordPress, se necessario.
  • wp_deregister_script è l'esatto opposto. Elimina le definizioni fatte in wp_register_script, lo script non è più disponibile come dipendenza o per l'enqueue.

Gli script registrati non producono alcun output nel codice. Semplicemente definiscono lo script a livello programmatico in modo che WP possa reagire alle dipendenze e agli enqueue.

  • wp_enqueue_script effettivamente definisce e accoda uno script per l'output nell'header/footer della pagina HTML.
  • wp_dequeue_script fa l'esatto opposto e rimuove uno script dall'output.

L'effettiva stampa avviene durante l'azione 'wp_head' o 'wp_footer', a seconda dei dettagli di registrazione.

Un esempio:

wp_deregister_script('jquery');
wp_register_script('jquery', ("https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"), false, '1.9.1', true);

wp_enqueue_script( 'script-1', get_template_directory_uri() . '/js/example1.js', array('jquery'), '1.0.0', false );
wp_enqueue_script( 'script-2', get_template_directory_uri() . '/js/example2.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-3', get_template_directory_uri() . '/js/example3.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-4', get_template_directory_uri() . '/js/example4.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-5', get_template_directory_uri() . '/js/example5.js', array('jquery'), '1.0.0', true );

In questo esempio deregistro jQuery. Non è più disponibile e otterrei lo stesso errore che hai tu, se non lo registrassi di nuovo. (Questa volta dal CDN di Google nella speranza che velocizzi la mia pagina.)

Ma alla riga tre jQuery non verrà stampato. Non apparirà da nessuna parte. Dalla riga quattro chiamo una serie di script, che hanno tutti jQuery come dipendenza. Il primo risiede nell'header, tutti gli altri nel footer. A causa delle dipendenze, jQuery viene automaticamente accodato nell'header, perché è necessario lì per primo.

Quindi, con il sistema degli script di WordPress, che è piuttosto solido, non c'è bisogno di gestire interferenze o richieste precedenti. Gli script registrati vengono chiamati quando necessario una sola volta, e solo quando necessario.

Nel tuo esempio deregistri lo script alla riga 1 della funzione e lo richiami alla riga 2. Ma a causa della deregistrazione WordPress ha dimenticato tutti i dettagli come URL, versione, dipendenze e così via. La funzione corretta nella tua logica sarebbe stata wp_dequeue_script, ma anche quella non è necessaria. WordPress valuta la necessità guardando agli script accodati o alle dipendenze.

Modifica:

come fa WordPress a fermare il caos lasciato da 8 plugin diversi che cercano di aggiungere versioni diverse di jQuery?

L'ultima istanza di registrazione di jQuery prima dell'azione wp_print_scripts è quella che viene stampata. Questo è essenzialmente lo scopo del sistema di priorità nelle azioni/filtri.

3 lug 2014 11:01:13
Commenti

Ora ha più senso per me... Due note: 1) Facendo ulteriori ricerche vedo che nel core di WordPress jquery = jquery.js & jquery-migrate.js (ops... ho appena risposto alla mia altra domanda!) come da http://codex.wordpress.org/Function_Reference/wp_register_script#Handles_and_Their_Script_Paths_Registered_by_WordPress. 2) Sono ancora confuso su cosa succede quando 8 plugin diversi provano tutti a REGISTRARE e poi ad accodare la loro versione di jquery. Quale prevale? È come la specificità CSS?

zipzit zipzit
3 lug 2014 11:12:04

L'ultima chiamata di registrazione eseguita è quella che prevale. Tieni presente: nulla viene mai eseguito contemporaneamente, tutto viene eseguito in sequenza, devi solo capire l'ordine in cui le cose vengono eseguite.

Hendrik Luehrsen Hendrik Luehrsen
3 lug 2014 11:16:30
0

Per contribuire, prima di tutto, grazie per il complimento, apprezzato.

Stai utilizzando un child theme, di cui il tema genitore dovrebbe aver caricato la libreria jQuery integrata in WordPress. Come ho detto nel post a cui ti riferisci, è una cattiva pratica, sottolineo, per qualsiasi tema genitore non caricare jQuery di default.

Hai un paio di problemi con il tuo codice. Innanzitutto, mai deregistrare la libreria jQuery predefinita, rischieresti di rompere qualcosa in seguito. Il modo corretto è rimuovere lo script dalla coda utilizzando wp_dequeue_scripts.

Solo una domanda però: perché hai bisogno di rimuovere jQuery dalla coda e ricaricarlo? Questo viene solitamente utilizzato dagli autori di plugin solo per assicurarsi che jQuery non venga caricato due volte, il motivo è che i plugin funzionano su tutti i temi, quindi è impossibile sapere se il tema che un utente sta utilizzando con il plugin ha jQuery caricato. Stai utilizzando un child theme che funzionerà solo su quel specifico tema genitore, quindi saprai se il tema genitore ha jQuery caricato. Quindi non c'è bisogno di rimuoverlo e ricaricarlo.

In secondo luogo, devi considerare la priorità. add_action ha 4 parametri, il terzo dei quali è la priorità ($priority). Solitamente i plugin e i child theme caricano i loro script dopo un tema genitore per assicurarsi che non vengano sovrascritti in seguito. Quindi è saggio e buona pratica eseguire la tua azione per ultima. Per farlo, avrai bisogno di una priorità molto bassa, cioè un numero molto alto.

  add_action( 'wp_enqueue_scripts', 'jquery_loadup', 999 );
3 lug 2014 11:25:14