Cum să suprascrii fișierele JavaScript în tema copil?
Încarc câteva fișiere JavaScript în tema părinte. Calea în tema părinte este:
scripts > custom.js
În tema copil, creez aceeași cale (scripts > custom.js
) și modific o parte din jQuery în interiorul fișierului custom.js
.
Problema este că modificările nu sunt aplicate. Este aceasta o modalitate greșită de a face modificări la aceste fișiere în tema copil?

Temele copil suprascriu doar fișierele PHP (cum ar fi header.php) care sunt incluse folosind funcții precum get_template_part sau get_header, etc.
Modul corect de a adăuga scripturi în WordPress este cu wp_enqueue_script. Dacă tema părinte folosește această funcție, puteți suprascrie fișierele JS folosind wp_dequeue_script și încărcându-le pe cele proprii.
Ca în exemplul următor...
<?php
// conectează-te târziu pentru a te asigura că înregistrarea temei părinte
// a fost executată, astfel încât să o poți anula. Altfel tema părinte va continua
// să încarce scriptul său oricum.
add_action('wp_enqueue_scripts', 'wpse26822_script_fix', 100);
function wpse26822_script_fix()
{
wp_dequeue_script('parent_theme_script_handle');
wp_enqueue_script('child_theme_script_handle', get_stylesheet_directory_uri().'/scripts/yourjs.js', array('jquery'));
}
Dacă tema părinte nu utilizează wp_enqueue_script, probabil folosește wp_head (sau wp_footer) pentru a afișa scripturile acolo. Așadar, puteți folosi remove_action pentru a elimina acele funcții care afișează scripturile, apoi încărcați propriul script.
Dacă scriptul este hardcodat în fișierul șablon, va trebui doar să înlocuiți acel fișier șablon în tema copil fără tag-ul script.
Dacă au folosit apeluri wp_enqueue_script care utilizează get_stylesheet_directory_uri, atunci nu ar trebui să fie nevoie să faceți nimic. Deoarece acest lucru nu se întâmplă, va trebui să investigați pentru a vedea ce a făcut autorul temei.

dacă tema părinte folosește get_stylesheet_directory_uri pentru a încărca scripturi, atunci tema copil va trebui să duplice toate scripturile încărcate astfel, deoarece altfel acestea nu vor fi găsite. Nu există un mecanism de rezervă în get_stylesheet_directory_uri pentru a verifica dacă un fișier individual există în tema copil și să revină la fișierul temei părinte dacă este necesar.

Din Codex: „wp_print_scripts nu ar trebui folosit pentru a încărca stiluri sau scripturi pe pagina principală. Folosiți wp_enqueue_scripts în schimb.” http://codex.wordpress.org/Plugin_API/Action_Reference/wp_print_scripts

Țineți cont de când a fost scris acest lucru: acum doi ani. Înainte ca wp_enqueue_scripts
să poată fi folosit doar pentru a încărca scripturi pe frontend. Actualizat. Dacă observați ceva învechit, nu ezitați să editați.

Scuze, nu am vrut să critic, am dat upvote la răspunsul tău :)

Te rog să ții cont că poate fi necesar să setezi o prioritate mai mare (de exemplu 100) pentru a te asigura că dezactivarea se întâmplă după încărcarea scriptului din tema părinte.
add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 );
din http://codex.wordpress.org/Function_Reference/wp_dequeue_script

Actualizare pentru 2016: conform http://stackoverflow.com/questions/23507179/wp-dequeue-script-for-child-theme-to-replace-script trebuie să folosim și wp_deregister_script('parent-script-handle');
pentru a elimina complet scriptul părinte. Într-adevăr, nu a funcționat pentru mine fără aceasta. WP 4.6.1

poți să răspunzi la întrebarea mea aici, te rog? Acest răspuns este puțin confuz: https://wordpress.stackexchange.com/questions/286957/modifying-js-files-in-child-theme

@PhiLho, eu folosesc versiunea 5.4, și wp_dequeue_script()
a funcționat pentru mine singur. Tema părinte avea wp_enqueue_script( 'fitvids', get_template_directory_uri() . '/js/fitvids.js', array( 'jquery' ), '1.1', true );
-- poate are legătură cu modul în care scriptul a fost încărcat de tema părinte?

@PhiLho, am adăugat și wp_deregister_script
, asta nu a schimbat nimic, dar poate a eliberat niște memorie inutil ocupată de înregistrarea scriptului. Am mai adăugat două acțiuni pentru 'wp_enqueue_scripts', prioritatea implicită pentru a încarca fișierul meu CSS de suprascriere, dar pentru a scăpa de script am adăugat încă una, cu prioritatea 100, cum sugera răspunsul. Dar faptul că nu a funcționat nu poate fi explicat prin problema ordinii de încărcare, pentru că în cazul meu, dezactivarea sau deregistrarea în hook-ul cu prioritate normală doar a înregistrat erori. Ciudat, în orice caz.

În unele cazuri, este important să prioritizăm atât apelurile funcțiilor add_action, cât și wp_enqueue_script, astfel:
add_action('wp_enqueue_scripts', 'wpse26822_script_fix', 20120207);
function wpse26822_script_fix()
{
wp_dequeue_script('storefront-navigation');
wp_enqueue_script('my_storefront-navigation', get_stylesheet_directory_uri().'/js/navigation.min.js', array('jquery'),20151110,true);
}
În acest caz, wp_enqueue_scripts a fost apelat de tema părinte cu o prioritate de 20120206 (data) și astfel această acțiune este adăugată cu o prioritate puțin mai mare pentru a fi imediat eliminată din coadă. Apoi, instrucțiunea de încărcare care urmează este de fapt prioritizată după aceea pentru a se asigura că se încarcă după ce cea veche a fost eliminată. Parametrul true, în acest caz, este de asemenea important pentru că specifică faptul că scriptul trebuie încărcat în subsolul paginii (footer), care este locul unde scriptul părinte a fost inițial încărcat.
De asemenea, nu pot să explic complet, dar am observat că, dacă ești atent la eliminarea scriptului inițial imediat după ce a fost încărcat în coadă, se pare că poți efectiv împiedica încărcarea lui de la bun început.

Funcția wp_enqueue_script
nu are un parametru de prioritate, este doar un număr de versiune care este concatenat la sfârșitul căii ca un șir de interogare. Acest parametru este folosit pentru a se asigura că versiunea corectă este trimisă clientului indiferent de caching [...]

apelează wp_deregister_script înainte de a înregistra propria versiune

// încarcă fișierul de script necesar
add_action('wp_enqueue_scripts', 'your_child_theme_js_file_override');
function your_child_theme_js_file_override(){
wp_enqueue_script( 'child_theme_script_handle', get_stylesheet_directory_uri() . '/assets/js/your-file.js', array('jquery' ) );
}
// elimină fișierul de script necesar din coadă
function your_child_theme_js_file_dequeue() {
wp_dequeue_script( 'parent_theme_script_handle' );
}
add_action( 'wp_print_scripts', 'your_child_theme_js_file_dequeue', 100 );

Începând cu WordPress versiunea 4.7, puteți utiliza funcția 'get_theme_file_uri()' care va căuta mai întâi în directorul temei copil și apoi în cel al temei părinte. Astfel, fișierul din tema copil va avea prioritate.
wp_enqueue_script('custom-js', get_theme_file_uri() . '/scripts/custom.js');
