Qual è il modo preferito per aggiungere file javascript personalizzati al sito?


68

Ho già aggiunto i miei script, ma volevo sapere il modo preferito.
Ho appena inserito un <script>tag direttamente nel header.phpmio modello.

Esiste un metodo preferito per inserire file js esterni o personalizzati?
Come assocerei un file js a una singola pagina? (Ho in mente la home page)


Dai un'occhiata alla mia domanda di qualche giorno fa , la risposta a una parte della tua domanda è lì: - Come collegare file jQuery / Javascript esterni con WordPress
Ben Everard

4
Ottima domanda! È una domanda molto comune che le persone chiedono e qualcosa che dobbiamo assolutamente avere ben documentato qui.
MikeSchinkel,

Grazie. L'ho già visto, ma non ha coperto completamente la mia domanda.
naugtur,

Va bene, sapevo che non avrebbe risposto a tutte le tue domande, ma per le persone che navigano in futuro c'è un riferimento all'altro post :-)
Ben Everard

Risposte:


78

Usa wp_enqueue_script()nel tuo tema

La risposta di base è utilizzare wp_enqueue_script()un wp_enqueue_scriptshook per front-end admin_enqueue_scriptsper admin. Potrebbe assomigliare a questo (che presuppone che tu stia chiamando dal functions.phpfile del tuo tema ; nota come faccio riferimento alla directory del foglio di stile):

<?php
add_action( 'wp_enqueue_scripts', 'mysite_enqueue' );

function mysite_enqueue() {
  $ss_url = get_stylesheet_directory_uri();
  wp_enqueue_script( 'mysite-scripts', "{$ss_url}/js/mysite-scripts.js" );
}

Queste sono le basi.

Script dipendenti predefiniti e multipli

Ma supponiamo che tu voglia includere sia l'interfaccia utente jQuery che jQuery ordinabile dall'elenco degli script predefiniti inclusi in WordPress e desideri che lo script dipenda da essi? Facile, basta includere i primi due script usando gli handle predefiniti definiti in WordPress e per il tuo script fornire un terzo parametro a wp_enqueue_script()cui è un array di handle di script utilizzati da ogni script, in questo modo:

<?php
add_action( 'wp_enqueue_scripts', 'mysite_enqueue' );

function mysite_enqueue() {
  $ss_url = get_stylesheet_directory_uri();
  wp_enqueue_script( 'mysite-scripts', "{$ss_url}/js/mysite-scripts.js", array( 'jquery', 'jquery-ui-sortable' ) );
}

Script in un plugin

Cosa succede se si desidera farlo in un plug-in? Utilizzare la plugins_url()funzione per specificare l'URL del file Javascript:

<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue' );

function my_plugin_enqueue() {
  wp_enqueue_script( 'my-script', plugins_url('/js/my-script.js',__FILE__), array('jquery','jquery-ui-sortable'), MY_PLUGIN_VERSION );
}

Controllo delle versioni degli script

Nota anche che sopra abbiamo dato al nostro plugin un numero di versione e lo abbiamo passato come quarto parametro a wp_enqueue_script(). Il numero di versione viene generato nell'origine come argomento di query nell'URL per lo script e serve a forzare il browser a scaricare nuovamente il file eventualmente memorizzato nella cache se la versione viene modificata.

Caricare gli script solo sulle pagine dove necessario

La prima regola delle prestazioni Web dice di ridurre al minimo le richieste HTTP, quindi quando possibile dovresti limitare il caricamento degli script solo dove necessario. Ad esempio, se hai solo bisogno del tuo script nell'amministratore, limitalo alle pagine dell'amministratore usando admin_enqueue_scriptsinvece l' hook:

<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'admin_enqueue_scripts', 'my_plugin_admin_enqueue' );

function my_plugin_admin_enqueue() {
  wp_enqueue_script( 'my-script', plugins_url( '/js/my-script.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable' ), MY_PLUGIN_VERSION );
}

Carica i tuoi script nel piè di pagina

Se i tuoi script sono uno di quelli che devono essere caricati nel piè di pagina, c'è un quinto parametro wp_enqueue_script()che dice a WordPress di ritardarlo e posizionarlo nel piè di pagina (supponendo che il tuo tema non si sia comportato male e che in effetti chiama l'hook wp_footer come tutti i buoni temi di WordPress dovrebbero ):

<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'admin_enqueue_scripts', 'my_plugin_admin_enqueue' );

function my_plugin_admin_enqueue() {
  wp_enqueue_script( 'my-script', plugins_url( '/js/my-script.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable' ), MY_PLUGIN_VERSION, true );
}

Controllo granulare più fine

Se hai bisogno di un controllo più preciso di quello, Ozh ha un ottimo articolo intitolato Come: caricare Javascript con il tuo plugin WordPress che dettaglia di più.

Disabilitazione degli script per ottenere il controllo

Justin Tadlock ha un bell'articolo intitolato Come disabilitare script e stili nel caso in cui tu voglia:

  1. Combina più file in singoli file (il chilometraggio può variare con JavaScript qui).
  2. Carica i file solo nelle pagine che stiamo utilizzando lo script o lo stile.
  3. Smetti di usare! Important nel nostro file style.css per fare semplici aggiustamenti CSS.

Passando valori da PHP a JS con wp_localize_script()

Sul suo blog Vladimir Prelovac ha un ottimo articolo intitolato Best practice per l'aggiunta di codice JavaScript ai plugin di WordPress in cui discute l'utilizzo wp_localize_script()per consentire all'utente di impostare il valore delle variabili nel PHP lato server da utilizzare successivamente nel Javascript lato client.

Controllo a grana davvero fine con wp_print_scripts()

E infine, se hai bisogno di un controllo molto preciso, puoi esaminare wp_print_scripts()come discusso su Beer Planet in un post intitolato Come includere CSS e JavaScript in modo condizionale e solo quando necessario per i post .

Epiloque

Questo è tutto per le migliori pratiche di includere file Javascript con WordPress. Se ho perso qualcosa (che probabilmente ho) assicurati di farmi sapere nei commenti in modo da poter aggiungere un aggiornamento per i futuri viaggiatori.


1
Questo è un articolo enorme! Ora ho molto da scegliere;)
naugtur

Ok, ha funzionato. Ora la seconda parte della domanda: come posso verificare se sono sulla homepage?
naugtur,


3
Agganciare admin_initinvece di chiedere is_admin(). Rimuovere il parametro version se si utilizza Google CDN, altrimenti la cache del browser conterrà due versioni: una senza la stringa di query di altri siti e la propria.
fuxia

@toscho - Buona chiamata, aggiornerò.
MikeSchinkel,

11

Per complimentarmi con la meravigliosa illustrazione di Mikes dell'utilizzo di acconciature, desidero solo sottolineare che gli script inclusi come dipendenze non devono essere accodati ...

Userò l'esempio sotto gli Script in un'intestazione Plugin nella risposta di Mike.

define('MY_PLUGIN_VERSION','2.0.1');

add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue_scripts' );
function my_plugin_enqueue_scripts() {
    wp_enqueue_script('jquery');
    wp_enqueue_script('jquery-ui-sortable');
    wp_enqueue_script('my-script',plugins_url('/js/my-script.js',__FILE__),array('jquery','jquery-ui-sortable'),MY_PLUGIN_VERSION);
}

Questo può essere ridotto per leggere ..

define('MY_PLUGIN_VERSION','2.0.1');

add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue_scripts' );
function my_plugin_enqueue_scripts() {
    wp_enqueue_script('my-script', plugins_url( '/js/my-script.js', __FILE__ ), array('jquery','jquery-ui-sortable'), MY_PLUGIN_VERSION);
}

Quando imposti le dipendenze, WordPress le troverà e le accoderà pronte per il tuo script, quindi non è necessario effettuare chiamate indipendenti per questi script.

Inoltre, alcuni di voi potrebbero chiedersi se l'impostazione di più dipendenze potrebbe causare l'output degli script nell'ordine sbagliato, qui fatemi un esempio

wp_enqueue_script( 'first-script', 'example/path/example_script_1.js', array('second-script','third-script') );

Se lo script due dipendesse dallo script tre (ovvero, lo script tre dovrebbe essere caricato per primo), questo non avrebbe importanza, WordPress determinerà le priorità di accodamento per quegli script e li produrrà nell'ordine corretto, in breve, tutto verrà risolto automagicamente per te da WordPress.


Penso che initnon sia il posto giusto per spedire l'archetto.
brasofilo,

Il codice è stato originariamente copiato dalla risposta di Mike, quindi adattato per illustrare un punto. Tuttavia, hai ragione, quindi ho aggiornato la risposta per utilizzare un hook migliore e più corretto.
t31os,

0

Per piccoli script, che potresti non voler includere in un file separato, ad esempio perché generati dinamicamente, WordPress 4.5 e altre offerte wp_add_inline_script. Questa funzione fondamentalmente aggancia lo script a un altro script.

Supponiamo, ad esempio, che stai sviluppando un tema e desideri che il tuo cliente sia in grado di inserire i propri script (come Google Analytics o AddThis) attraverso la pagina delle opzioni. È quindi possibile utilizzare wp_add_inline_scriptper agganciare quello script al file js principale (diciamo mainjs) in questo modo:

$custom_script = get_option('my-script')
if (!empty($custom_script)) wp_add_inline_script ('mainjs', $custom_script);

0

Il mio modo preferito è ottenere buone prestazioni, quindi piuttosto che usare wp_enqueue_scriptutilizzo HEREDOC con l'API Fetch per caricare tutto in modo asincrono in parallelo:

$jquery_script_path = '/wp-includes/js/jquery/jquery.js?ver=1.12.4';
$jquery_dependent_script_paths = [
  get_theme_file_uri( '/assets/js/global.js' ),
  get_theme_file_uri( '/assets/js/jquery.scrollTo.js' ),
  get_theme_file_uri( '/assets/js/skip-link-focus-fix.js' ),
  get_theme_file_uri( '/assets/js/navigation.js' )
];
$jquery_dependent_script_paths_json = json_encode($jquery_dependent_script_paths);
$inline_scripts = <<<EOD
<script>
(function () {
  'use strict';
  if (!window.fetch) return;
  /**
   * Fetch Inject v1.6.8
   * Copyright (c) 2017 Josh Habdas
   * @licence ISC
   */
  var fetchInject=function(){"use strict";const e=function(e,t,n,r,o,i,c){i=t.createElement(n),c=t.getElementsByTagName(n)[0],i.type=r.blob.type,i.appendChild(t.createTextNode(r.text)),i.onload=o(r),c?c.parentNode.insertBefore(i,c):t.head.appendChild(i)},t=function(t,n){if(!t||!Array.isArray(t))return Promise.reject(new Error("`inputs` must be an array"));if(n&&!(n instanceof Promise))return Promise.reject(new Error("`promise` must be a promise"));const r=[],o=n?[].concat(n):[],i=[];return t.forEach(e=>o.push(window.fetch(e).then(e=>{return[e.clone().text(),e.blob()]}).then(e=>{return Promise.all(e).then(e=>{r.push({text:e[0],blob:e[1]})})}))),Promise.all(o).then(()=>{return r.forEach(t=>{i.push({then:n=>{"text/css"===t.blob.type?e(window,document,"style",t,n):e(window,document,"script",t,n)}})}),Promise.all(i)})};return t}();
  fetchInject(
    $jquery_dependent_script_paths_json
  , fetchInject([
    "{$jquery_script_path}"
  ]));
})();
</script>
EOD;

E poi inseriscili nella testa, a volte insieme a stili come questo:

function wc_inline_head() {
  global $inline_scripts;
  echo "{$inline_scripts}";
  global $inline_styles;
  echo "{$inline_styles}";
}

Il risultato è una cascata simile a questa, che carica tutto in una volta ma controlla l'ordine di esecuzione:

inserisci qui la descrizione dell'immagine

Nota: questo richiede l'uso dell'API Fetch, che non è disponibile in tutti i browser.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.