Care este modul recomandat de a adăuga fișiere javascript personalizate în site?
Mi-am adăugat deja scripturile, dar aș vrea să știu care este modul recomandat.
Am pus doar un tag <script>
direct în header.php
al șablonului meu.
Există o metodă preferată de inserare a fișierelor js externe sau personalizate?
Cum aș putea să leg un fișier js doar de o singură pagină? (Mă gândesc la pagina principală)

Folosește wp_enqueue_script()
în tema ta
Răspunsul de bază este să folosești wp_enqueue_script()
într-un hook wp_enqueue_scripts
pentru front-end și admin_enqueue_scripts
pentru admin. Ar putea arăta astfel (presupunând că apelezi din fișierul functions.php
al temei tale; observă cum fac referire la directorul stylesheet-ului):
<?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" );
}
Acestea sunt elementele de bază.
Scripturi predefinite și multiple dependente
Dar să presupunem că vrei să incluzi atât jQuery cât și jQuery UI Sortable din lista de scripturi implicite incluse cu WordPress și vrei ca scriptul tău să depindă de ele? Simplu, doar includ primele două scripturi folosind handles predefinite în WordPress și pentru scriptul tău oferi un al 3-lea parametru lui wp_enqueue_script()
care este un array de handles ale scripturilor folosite, astfel:
<?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' ) );
}
Scripturi într-un plugin
Și dacă vrei să faci asta într-un plugin? Folosește funcția plugins_url()
pentru a specifica URL-ul fișierului tău 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 );
}
Versionarea scripturilor
De asemenea, observă că mai sus am dat pluginului nostru un număr de versiune și l-am pasat ca al 4-lea parametru lui wp_enqueue_script()
. Numărul de versiune este afișat în sursă ca argument de query în URL-ul către script și servește pentru a forța browserul să reîncarce fișierele posibil cache-uite dacă versiunea s-a schimbat.
Încarcă scripturile doar pe paginile unde sunt necesare
Prima regulă a Performanței Web spune să Minimizezi Cererile HTTP așa că ori de câte ori este posibil ar trebui să limitezi încărcarea scripturilor doar acolo unde sunt necesare. De exemplu, dacă ai nevoie de scriptul tău doar în admin, limitează-l la paginile de admin folosind hook-ul admin_enqueue_scripts
:
<?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 );
}
Încarcă scripturile în footer
Dacă scriptul tău este unul dintre cele care trebuie încărcate în footer, există un al 5-lea parametru al lui wp_enqueue_script()
care îi spune WordPress să-l amâne și să-l plaseze în footer (presupunând că tema ta nu se comportă greșit și că într-adevăr apelează hook-ul wp_footer cum ar trebui să facă orice temă WordPress bună):
<?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 );
}
Control mai fin
Dacă ai nevoie de un control mai fin decât atât, Ozh are un articol excelent intitulat How To: Load Javascript With Your WordPress Plugin care detaliază mai multe.
Dezactivarea scripturilor pentru a obține control
Justin Tadlock are un articol frumos intitulat How to disable scripts and styles în cazul în care vrei să:
- Combini mai multe fișiere în fișiere unice (rezultatele pot varia cu JavaScript aici).
- Încărci fișierele doar pe paginile unde folosim scriptul sau stilul.
- Nu mai folosești !important în fișierul nostru style.css pentru a face ajustări CSS simple.
Transmiterea valorilor de la PHP la JS cu wp_localize_script()
Pe blogul său, Vladimir Prelovac are un articol excelent intitulat Best practice for adding JavaScript code to WordPress plugins unde discută folosirea wp_localize_script()
pentru a permite setarea valorilor variabilelor în PHP pe partea de server pentru a fi folosite mai târziu în JavaScript pe partea de client.
Control foarte fin cu wp_print_scripts()
Și în final, dacă ai nevoie de un control foarte fin, poți să te uiți la wp_print_scripts()
așa cum este discutat pe Beer Planet într-un post intitulat How To Include CSS and JavaScript Conditionally And Only When Needed By The Posts.
Epilog
Cam acestea sunt cele mai bune practici pentru includerea fișierelor JavaScript în WordPress. Dacă am omis ceva (ceea ce probabil am făcut), anunță-mă în comentarii pentru a putea adăuga un update pentru călătorii viitori.

Ok, a funcționat. Acum a doua parte a întrebării - cum verific dacă sunt pe pagina principală?

Caută răspunsul aici: http://wordpress.stackexchange.com/questions/575/why-isnt-is-home-working-correctly

Folosește hook-ul admin_init
în loc să verifici is_admin()
. Elimină parametrul de versiune dacă folosești Google CDN, altfel cache-ul browserului va reține două versiuni: una fără query string de la alte site-uri și a ta.

@toscho Cred că e mai bine să elimini ver
selectiv decât întregul query string (nu contează pentru Google dar poate conta pentru URL-uri mai complexe), vezi versiunea mea în colecția functions.php @MikeSchinkel vezi același lucru pentru trucul de URL care va prelua întotdeauna cea mai recentă versiune a scriptului de la Google CDN, am învățat recent

@Rarst, da, funcția mea afectează doar URI-urile de la Google CDN. În alte cazuri poate fi util să păstrezi parametrul.

Mike, poate ai nevoie să ții cont că atunci când declari un array de dependențe, nu este nevoie să încarci acele scripturi individual. În majoritatea exemplelor postate, de fapt nu ai nevoie de câteva dintre încărcări (acestea vor fi încărcate oricum, pur și simplu pentru că au fost declarate ca dependențe).

@t31os - Sunt puțin suprasolicitat momentan; de ce nu adaugi un alt răspuns aici pentru a completa sugestia mea cu acest detaliu?

http://scribu.net/wordpress/conditional-script-loading-revisited.html

Pentru a completa ilustrația minunată a lui Mike despre utilizarea funcțiilor de enqueue, doresc să subliniez că scripturile incluse ca dependințe nu trebuie să fie încărcate manual...
Voi folosi exemplul din secțiunea Scripturi într-un Plugin din răspunsul lui 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);
}
Acest cod poate fi simplificat astfel:
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);
}
Când setați dependințele, WordPress va găsi și va încărca automat scripturile necesare, așa că nu este nevoie să le încărcați separat.
În plus, unii dintre voi s-ar putea întreba dacă setarea mai multor dependințe ar putea determina încărcarea scripturilor în ordinea greșită. Iată un exemplu:
wp_enqueue_script( 'first-script', 'example/path/example_script_1.js', array('second-script','third-script') );
Dacă al doilea script ar depinde de al treilea script (adică al treilea script ar trebui să se încarce primul), acest lucru nu ar conta. WordPress va determina prioritățile de încărcare pentru aceste scripturi și le va afișa în ordinea corectă. Pe scurt, WordPress rezolvă automat toate aceste detalii pentru voi.

Cred că init
nu este locul potrivit pentru a trimite coada (enqueue).

Pentru fragmente mici de scripturi, pe care poate nu doriți să le includeți într-un fișier separat, de exemplu pentru că sunt generate dinamic, WordPress 4.5 și versiunile ulterioare oferă funcția wp_add_inline_script
. Această funcție atașează practic scriptul la un alt script.
Să presupunem, de exemplu, că dezvoltați o temă și doriți ca clientul dvs. să poată insera propriile scripturi (cum ar fi Google Analytics sau AddThis) prin pagina de opțiuni. Ați putea folosi wp_add_inline_script
pentru a atașa acel script la fișierul js principal (să spunem mainjs
) astfel:
$custom_script = get_option('my-script')
if (!empty($custom_script)) wp_add_inline_script ('mainjs', $custom_script);

Modul meu preferat de a obține performanță bună este să evit folosirea wp_enqueue_script
și să utilizez HEREDOC cu Fetch API pentru a încărca totul asincron și în paralel:
$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;
Apoi le inserez în head, uneori împreună cu stiluri, astfel:
function wc_inline_head() {
global $inline_scripts;
echo "{$inline_scripts}";
global $inline_styles;
echo "{$inline_styles}";
}
Rezultând într-o încărcare paralelă, dar cu control asupra ordinii de execuție, ca în exemplul următor:
Notă: Această metodă necesită utilizarea Fetch API, care nu este disponibil în toate browserele.
