Cum se încarcă jQuery-ul WordPress în secțiunea <head>

25 aug. 2013, 19:28:13
Vizualizări: 33.6K
Voturi: 7

În blogul meu WordPress am inclus un slideshow bazat pe javascript în partea de sus care funcționează bine. Am un fișier PHP care generează javascript-ul necesar ce trebuie să meargă în tag-ul <head> prin intermediul unui "add_action" în fișierul functions.php al temei copil:

function add_slideshow_js() {
include('/path/slideshow_output.php');
echo $js_output;
}
add_action( 'wp_head', 'add_slideshow_js' );

JavaScript-ul pe care îl generează acest PHP include un apel către fișierul javascript de control:

<script src="path/slideshow.js" type="text/javascript"></script>

... urmat de javascript-ul care creează slideshow-ul paginii.

Totul funcționează foarte bine și arată grozav. Problema este că depinde de jquery, dar funcționa bine, așa că m-am întrebat cum era de fapt inclus jquery.

Am dezactivat toate plugin-urile și a încetat să mai funcționeze. Deci evident unul dintre ele includea jquery și permitea funcționarea.

Dar m-am gândit că aș vrea să mă asigur că jquery va fi inclus, fără să mă bazez pe un plugin, deoarece s-ar putea să șterg plugin-ul vital la un moment dat în viitor, și bineînțeles că aș vrea ca slideshow-ul să funcționeze în continuare.

Așa că, cu toate plugin-urile dezactivate, m-am gândit să includ jquery explicit eu însumi, scriind această funcție în fișierul functions.php al temei copil:

function insert_jquery(){
   wp_enqueue_script('jquery');
}
add_filter('wp_head','insert_jquery');

Acum, asta include într-adevăr jquery, dar este apelat în footer, și experimentând am descoperit că slideshow-ul va funcționa doar dacă jquery este apelat în interiorul tag-ului <head>.

Aș putea scrie o funcție pentru a apela propriul meu fișier jquery, dar am impresia că este mai bine să folosesc jquery-ul inclus cu WordPress, și oricum, m-am gândit că reactivarea plugin-urilor ar face ca jquery să fie apelat de două ori.

Deci ce funcție pot scrie în fișierul functions.php al temei copil care va încărca în mod fiabil jquery-ul WordPress în secțiunea <head> a paginii?

Sper că toate acestea au sens.

0
Toate răspunsurile la întrebare 4
7
12

În mod implicit, dacă încărci jQuery, acesta este adăugat în header, dar dacă vreun plugin modifică acest comportament implicit și îl adaugă în footer în loc de header, poți folosi următorul cod pentru a-l forța să se adauge din nou în header.

function insert_jquery(){
wp_enqueue_script('jquery', false, array(), false, false);
}
add_filter('wp_enqueue_scripts','insert_jquery',1);

Pentru mai multe informații despre funcția wp_enqueue_script() vizitează această pagină.

25 aug. 2013 20:07:45
Comentarii

Am descoperit că adăugarea acestui cod exact de funcție în fișierul functions.php al temei mele child readuce jquery în <head> și astfel re-activează slideshow-ul meu. Asta e minunat, dar totuși sunt nedumerit, deoarece păreați să implicați că scopul acesteia este de a preveni ca vreun plugin 'rebel' să plaseze jquery în footer - dar toate pluginurile mele sunt dezactivate. Deci ce anulează ea?

John Doe John Doe
25 aug. 2013 20:36:38

Ea doar adaugă scriptul în header care este necesar pentru ca slideshow-ul tău să funcționeze, dar dacă unele dintre pluginurile tale îl adăugau în footer, este posibil ca anumite funcționalități ale acelor pluginuri care necesitau acest script în footer să nu mai funcționeze corect.

Vinod Dalvi Vinod Dalvi
25 aug. 2013 20:41:20

Nu înțeleg ce ar putea forța încărcarea jquery în footer când absolut toate pluginurile mele sunt dezactivate. Pot face acest lucru chiar și în starea de dezactivare?

John Doe John Doe
25 aug. 2013 20:48:33

Nu, ei nu fac asta la dezactivare. Încearcă să schimbi tema la o altă temă precum twentytwelve implicită și apoi verifică.

Vinod Dalvi Vinod Dalvi
25 aug. 2013 20:51:11

Schimbarea temei nu face nicio diferență. Pentru a rezuma, cu toate plugin-urile dezactivate, o încercare de a adăuga jquery cu function insert_jquery(){ wp_enqueue_script('jquery'); } add_filter('wp_head','insert_jquery'); încarcă jquery în footer, în timp ce folosirea codului de mai sus în schimb îl încarcă în tag-ul <head> așa cum ar trebui să facă. Nu înțeleg acest comportament.

John Doe John Doe
25 aug. 2013 22:03:38

Un lucru este că folosești hook-ul wp_head în loc de wp_enqueue_scripts care este recomandat pentru adăugarea scripturilor, iar altul este că ultimul parametru al funcției wp_enqueue_script() este boolean care specifică dacă să-l includă în footer, pe care eu l-am setat la false. Vezi aici http://codex.wordpress.org/Function_Reference/wp_enqueue_script

Vinod Dalvi Vinod Dalvi
25 aug. 2013 22:16:30

Scripturile ar trebui să fie dezactivate explicit înainte de a fi activate din nou.

vhs vhs
7 iun. 2017 09:24:29
Arată celelalte 2 comentarii
0
function insert_jquery_in_header(){
wp_enqueue_script('jquery', false, array(), false, false);
}
add_filter('wp_enqueue_scripts','insert_jquery_in_header',1);

În mod implicit WordPress încarcă fișierele JavaScript în subsolul paginii (footer), așa că prin această metodă poți forța încărcarea lor în antet (header). Sper să te ajute!

21 aug. 2017 19:48:12
2

Presupun că ai un plugin care manipulează înregistrarea scripturilor astfel încât jQuery se încarcă în subsol. Sunt destul de sigur că, în mod implicit, se încarcă în <head>. Poți încerca să faci slideshow-ul să funcționeze dacă este inclus în subsol sau poți identifica care plugin cauzează problema și încerca să o corectezi. Aceasta ar putea funcționa, dar nu am testat-o.

function insert_jquery(){
   wp_enqueue_script('jquery');
}
add_filter('wp_enqueue_scripts','insert_jquery',1);

Însă, pe termen lung, ceea ce faci nu este metoda corectă de a încărca scripturi. Ar trebui să înregistrezi și să încarci în coadă slideshow.js și, aproape sigur, să extragi JavaScript-ul din slideshow_output.php și să înregistrezi și să încarci în coadă, transmitând variabile către script prin wp_localize_script. Apoi, poți folosi parametrul $deps (vezi linkurile) pentru a te asigura că totul se încarcă în ordinea necesară.

25 aug. 2013 19:54:18
Comentarii

Înțeleg că trebuie să cercetez și să învăț problemele de "vedere de ansamblu" la care faceți referire, dar sunt nedumerit cum pluginul 'rogue' poate face încă încărcarea jquery în subsol când toate pluginurile au fost dezactivate temporar.

John Doe John Doe
25 aug. 2013 20:13:04

Dacă nu este vorba de plugin, atunci este vorba de temă sau, mai puțin probabil, de un mu-plugin. Răspunsul lui @VinodDalvi susține ideea că jQuery se încarcă în mod implicit în head.

s_ha_dum s_ha_dum
25 aug. 2013 20:19:11
0

Problemele mele s-au rezolvat (folosind WP 5.3.2 plus o temă goală fără fișiere externe) când am încărcat un script propriu cu o dependență adăugată față de jQuery (care este încărcat implicit de WP).

function load_assets() {
    wp_enqueue_script( 'mm-scrollfix', site_url( '/wp-content/js/mm-scrollfix-1.0.js' , __FILE__ ), array( 'jquery' ), '1.0', true );
}
add_action( 'wp_enqueue_scripts', 'load_assets' );

Această dependență pare să, uh, "trezească" jQuery. Rețineți că ultimul argument "true" din cod servește pentru a încărca resursa înainte de închiderea tag-ului body în loc de head; acesta fiind locul în care wp_enqueue_scripts încarcă implicit.

Dacă încarc conținutul fișierului .js în cauză folosind hook-ul wp_footer (care este chiar mai jos în pagină), fără a declara dependența, rezultă o eroare:

Uncaught ReferenceError: jQuery is not defined.

Deci, poate asta înseamnă ceva, nu știu. Probabil voi primi downvote-uri - Stack Overflow este prea elegant pentru creierul meu modest. %)

Noroc.

22 ian. 2020 23:58:32