Come caricare jQuery di WordPress nella sezione head
Nel mio blog WordPress ho incluso uno slideshow basato su javascript nella parte superiore che funziona bene. Ho un file PHP che genera il javascript necessario che deve andare nel tag <head>
tramite un "add_action" nel file functions.php del mio tema child:
function add_slideshow_js() {
include('/path/slideshow_output.php');
echo $js_output;
}
add_action( 'wp_head', 'add_slideshow_js' );
Il javascript che questo PHP genera include una chiamata al file javascript di controllo:
<script src="path/slideshow.js" type="text/javascript"></script>
... seguito dal javascript che crea lo slideshow della pagina.
Funziona tutto molto bene e ha un bell'aspetto. Il fatto è che dipende da jQuery, ma funzionava bene, quindi mi sono chiesto come jQuery venisse effettivamente incluso.
Ho disattivato tutti i miei plugin e ha smesso di funzionare. Quindi ovviamente uno di loro includeva jQuery permettendogli di funzionare.
Ma ho pensato che vorrei assicurarmi che jQuery venga incluso, senza fare affidamento su un plugin, dato che potrei eliminare il plugin vitale in futuro e ovviamente vorrei che lo slideshow continui a funzionare.
Quindi, con tutti i plugin disabilitati, ho pensato di includere jQuery esplicitamente io stesso, scrivendo questa funzione nel file functions.php del mio tema child:
function insert_jquery(){
wp_enqueue_script('jquery');
}
add_filter('wp_head','insert_jquery');
Ora, questo include jQuery, ma viene chiamato nel footer, e sperimentando ho scoperto che lo slideshow funzionerà solo se jQuery viene chiamato all'interno del tag <head>
.
Potrei scrivere una funzione per chiamare il mio file jQuery personale, ma ho l'impressione che sia meglio utilizzare jQuery incluso con WordPress e, in ogni caso, ho pensato che riabilitando i plugin jQuery verrebbe chiamato due volte.
Quindi quale funzione posso scrivere nel file functions.php del mio tema child che farà caricare in modo affidabile jQuery di WordPress nella sezione <head>
della pagina?
Spero che tutto questo abbia senso.

Per impostazione predefinita, quando si accoda jQuery questo viene aggiunto nell'header, ma se un plugin ne modifica il comportamento predefinito aggiungendolo nel footer anziché nell'header, è possibile utilizzare il seguente codice per modificarlo e forzarlo nuovamente nell'header.
function insert_jquery(){
wp_enqueue_script('jquery', false, array(), false, false);
}
add_filter('wp_enqueue_scripts','insert_jquery',1);
Per maggiori informazioni sulla funzione wp_enqueue_script() visita questa pagina.

Ho scoperto che includere questo esatto codice della funzione nel file functions.php
del mio child theme posiziona nuovamente jquery
correttamente nell'<head>
e quindi riabilita il mio slideshow. È fantastico, ma sono ancora perplesso, poiché sembravi suggerire che il suo scopo fosse prevenire che qualche plugin "ribelle" posizionasse jquery
nel footer - ma tutti i miei plugin sono disabilitati. Quindi cosa sta sovrascrivendo?

Sta semplicemente aggiungendo lo script nell'header che è necessario per far funzionare il tuo slideshow, ma poiché alcuni dei tuoi plugin lo aggiungevano nel footer (potrebbe esserci qualche funzionalità di quei plugin che richiede questo script nel footer), quelle funzionalità non funzioneranno correttamente.

Non capisco cosa possa forzare jquery
a caricarsi nel footer quando ogni singolo plugin è disabilitato. Possono farlo anche mentre sono disabilitati?

No, non lo fanno durante la disattivazione. Prova a cambiare tema con un altro tema predefinito come Twenty Twelve e poi verificalo.

Un cambio di tema non fa differenza. Per riassumere, con tutti i plugin disabilitati, un tentativo di aggiungere jquery
con function insert_jquery(){
wp_enqueue_script('jquery');
}
add_filter('wp_head','insert_jquery');
carica jquery
nel footer, mentre usando il codice sopra lo carica correttamente nel tag <head>
come dovrebbe fare. Non capisco questo comportamento.

Una cosa è che stai usando l'hook wp_head invece di wp_enqueue_scripts che è quello raccomandato per aggiungere script, e l'altra è che l'ultimo parametro della funzione wp_enqueue_script() è un booleano che indica se includerlo nel footer, che ho impostato su false. Vedi qui http://codex.wordpress.org/Function_Reference/wp_enqueue_script

function insert_jquery_in_header(){
wp_enqueue_script('jquery', false, array(), false, false);
}
add_filter('wp_enqueue_scripts','insert_jquery_in_header',1);
Per default WordPress carica i file JavaScript nel footer, quindi in questo modo puoi forzarne il caricamento nell'header, spero sia utile!

Suppongo che tu abbia un plugin che manipola la registrazione degli script in modo che jQuery venga caricato nel footer. Sono abbastanza sicuro che venga caricato nell'<head>
di default. Puoi provare a far funzionare il tuo slideshow se incluso nel footer oppure puoi identificare quale plugin sta causando il problema e cercare di correggerlo. Questo potrebbe funzionare, ma non l'ho testato.
function insert_jquery(){
wp_enqueue_script('jquery');
}
add_filter('wp_enqueue_scripts','insert_jquery',1);
In un'ottica più ampia, però, quello che stai facendo non è il modo corretto per caricare gli script. Dovresti registrare e accodare slideshow.js
e quasi sicuramente estrarre il Javascript da slideshow_output.php
e registrarlo e accodarlo, passando le variabili allo script tramite wp_localize_script
. Puoi quindi utilizzare il parametro $deps
(vedi i link) per assicurarti che tutto venga caricato nell'ordine corretto.

Capisco che devo ricercare e apprendere i problemi del "quadro generale" che indichi, ma sono perplesso su come il plugin 'rogue' possa ancora far caricare jquery
nel footer quando tutti i plugin sono stati temporaneamente disabilitati.

I miei problemi sono cessati (utilizzando WP 5.3.2 più un tema vuoto senza file esterni) quando ho caricato uno script personale con una dipendenza aggiunta verso jQuery (che è già incluso in WordPress di default).
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' );
Questa dipendenza sembra aver, diciamo, "risvegliato" jQuery. Nota che l'ultimo "true" nel codice serve a caricare l'asset prima del tag di chiusura del body invece che nell'head, che è dove wp_enqueue_scripts normalmente li posiziona.
Se carico il contenuto del file .js in questione usando l'hook wp_footer (che è ancora più in basso nella pagina), senza dichiarare la dipendenza, si ottiene un
Uncaught ReferenceError: jQuery is not defined.
Quindi, forse è un indizio, non so. Probabilmente riceverò downvote - Stack Overflow è troppo elegante per il mio cervello rudimentale. %)
Saluti.
