Încărcarea și descărcarea scripturilor în WordPress -- wp_deregister_script('jquery')
Am câteva întrebări legate de încărcarea și descărcarea scripturilor JavaScript în WordPress. După ce am citit un răspuns bine structurat la o întrebare de la Pieter Goosen, am decis să studiez și să curăț codul pe care îl folosesc pentru încărcarea bibliotecilor. Acest cod este din fișierul functions.php al temei mele child. Pe site-ul meu am câteva funcții care folosesc instrumentele calendaristice datepicker. În plus, există câteva plugin-uri care, sunt sigur, folosesc 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');
Am avut impresia că linia wp_deregister_script('jquery') resetează/șterge toate cererile anterioare pentru scripturile jQuery, astfel încât acestea să nu interfereze între ele. Această linie urmată de wp_enqueue_script('jquery'); ar trebui să rezulte într-o încărcare curată și minimală a jQuery prin sistemul de handle-uri și căi de scripturi utilizate în mod obișnuit de WordPress, nu? Mă gândesc că apelul deregister verifică prezența unei 'instalări' anterioare pentru jQuery și, dacă găsește una sau mai multe, oprește încărcarea acestora, iar dacă nu sunt înregistrate, nu face nimic.
Ceea ce observ este că atunci când folosesc wp_deregister_script('jquery'), primesc o eroare pe site "ReferenceError: jQuery is not defined". Când se întâmplă acest lucru, toate funcțiile mele JavaScript eșuează. Ce naiba? Când este comentată, site-ul funcționează fără probleme.
Întrebări: Lipsesc ceva? Ce nu înțeleg despre apelul deregister? De ce aș primi un mesaj de eroare?
Notă, linia pentru jquery-migrate este destinată software-ului care folosește versiuni mai vechi de jQuery. Am testat-o, dar nu văd că ar face ceva pe site-ul meu, așa că am eliminat-o pentru a îmbunătăți timpii de descărcare și răspuns. Întrebare: Este o idee proastă?
Referințe:
WordPress are în esență două grupuri de metode pentru gestionarea scripturilor, ambele ar trebui utilizate:
wp_register_scriptÎnregistrează un script în WordPress. Nu este apelat, este doar disponibil pentru WordPress, dacă este necesar.wp_deregister_scripteste exact opusul. Șterge definițiile făcute în wp_register_script, scriptul nu mai este disponibil ca dependență sau pentru încărcare.
Scripturile înregistrate nu afișează nimic în cod. Ele doar definesc scriptul programatic astfel încât WP să poată reacționa la dependențe și încărcări.
wp_enqueue_scriptdefinește efectiv și adaugă în coadă un script pentru afișare în antetul/subsolul paginii HTML.wp_dequeue_scriptface exact opusul și elimină un script din coada de afișare.
Afișarea efectivă are loc pe acțiunea 'wp_head' sau 'wp_footer', în funcție de detaliile de înregistrare.
Un exemplu:
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 );
În acest exemplu, am dezînregistrat jQuery. Nu mai este disponibil și aș primi aceeași eroare ca tine, dacă nu l-aș înregistra din nou. (De data aceasta de pe CDN-ul Google în speranța că va accelera pagina mea.)
Dar până la linia trei jQuery nu va fi afișat. Nu va apărea nicăieri. Dar începând cu linia patru apelez o serie de scripturi, care au toate jQuery ca dependență. Primul se află în antet, toate celelalte în subsol. Datorită dependențelor, jQuery este încărcat automat în antet, deoarece este necesar acolo mai întâi.
Deci, cu sistemul de scripturi al WordPress, care este destul de solid, nu este nevoie să gestionați interferențe sau cereri anterioare. Scripturile înregistrate sunt apelate când sunt necesare o singură dată și doar atunci când sunt necesare.
În exemplul tău ai dezînregistrat scriptul în linia 1 a funcției și l-ai apelat din nou în linia 2. Dar din cauza dezînregistrării WordPress a uitat toate detaliile precum URL, versiune, dependențe și așa mai departe. Funcția corectă în logica ta ar fi fost wp_dequeue_script, dar nici aceea nu este necesară. WordPress evaluează necesitatea fie prin analizarea scripturilor încărcate, fie a dependențelor.
Editare:
cum știe WordPress să oprească mizeria lăsată de 8 pluginuri diferite care încearcă să adauge versiuni diferite de jQuery?
Ultima instanță de înregistrare a jQuery înainte de acțiunea wp_print_scripts este cea care va fi afișată. Aceasta este în esență ceea ce face sistemul de priorități din acțiuni/filtre.
Acum are mai mult sens pentru mine... Două observații: 1) Pe măsură ce caut mai mult, văd că în nucleul WordPress jquery = jquery.js și jquery-migrate.js (ups... tocmai mi-am răspuns la cealaltă întrebare!) conform http://codex.wordpress.org/Function_Reference/wp_register_script#Handles_and_Their_Script_Paths_Registered_by_WordPress. 2) Încă sunt confuz ce se întâmplă când 8 plugin-uri diferite încearcă să ÎNREGISTREZE și apoi să încarce propria lor versiune de jquery. Care dintre ele câștigă? Este ca specificitatea CSS?
zipzit
Doar pentru a adăuga, în primul rând, mulțumesc pentru compliment, apreciez.
Folosești un child theme, iar tema părinte ar trebui să fi încărcat biblioteca jquery integrată în WordPress. Cum am spus în postarea la care te referi, este o practică proastă, subliniez, ca orice temă părinte să nu încarce jquery în mod implicit.
Ai câteva probleme cu codul tău. În primul rând, nu dezînregistra niciodată biblioteca jquery implicită, vei strica ceva mai târziu. Modul corect este să dezîncarci scriptul folosind wp_dequeue_scripts.
Doar o întrebare aici, de ce ai nevoie să dezîncarci jquery și să-l încarci din nou. Acest lucru este folosit de obicei de autorii de plugin-uri doar pentru a se asigura că jquery nu se încarcă de două ori, motivul fiind că plugin-urile funcționează pe toate temele, așa că este imposibil de știut dacă tema pe care o folosește un utilizator cu plugin-ul are jquery încărcat. Tu rulezi un child theme care va funcționa doar pe acea temă părinte specifică, așa că vei ști dacă tema părinte are jquery încărcat. Deci nu este nevoie să dezîncarci și să încarci din nou.
În al doilea rând, va trebui să te uiți la prioritate. add_action are 4 parametri, al treilea fiind prioritatea ($priority). De obicei, plugin-urile și child theme-urile își încarcă scripturile după o temă părinte pentru a se asigura că nu sunt suprascrise mai târziu. Așadar, este înțelept și o bună practică să rulezi acțiunea ta chiar la final. Pentru a face acest lucru, vei avea nevoie de o prioritate foarte mică, adică un număr foarte mare.
add_action( 'wp_enqueue_scripts', 'jquery_loadup', 999 );