Cum să suprascrii fișierele JavaScript în tema copil?

25 aug. 2011, 01:14:24
Vizualizări: 75.3K
Voturi: 43

Î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?

1
Comentarii

Ce este o Temă părinte? Cum sunt apelate scripturile de către Tema părinte?

Chip Bennett Chip Bennett
25 aug. 2011 01:17:34
Toate răspunsurile la întrebare 5
9
60

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.

25 aug. 2011 01:27:39
Comentarii

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.

User User
26 iul. 2012 16:20:01

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

Christian Lescuyer Christian Lescuyer
13 aug. 2013 17:53:02

Ț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.

chrisguitarguy chrisguitarguy
13 aug. 2013 18:02:49

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

Christian Lescuyer Christian Lescuyer
16 aug. 2013 22:46:47

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

Spone Spone
4 sept. 2014 08:18:24

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

PhiLho PhiLho
30 nov. 2016 11:58:14

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

csandreas1 csandreas1
26 nov. 2017 11:59:20

@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?

kkm mistrusts SE kkm mistrusts SE
5 apr. 2020 05:58:12

@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.

kkm mistrusts SE kkm mistrusts SE
5 apr. 2020 06:04:34
Arată celelalte 4 comentarii
1

Î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.

11 nov. 2015 03:24:10
Comentarii

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 [...]

Emile Bergeron Emile Bergeron
18 ian. 2016 16:51:50
1

apelează wp_deregister_script înainte de a înregistra propria versiune

25 dec. 2016 17:17:08
Comentarii

De ce? Acest lucru este necesar doar atunci când folosești același handle – ceea ce nu trebuie să faci. Probabil nici nu ar trebui, deoarece este mai ușor să depanezi codul a cărui sursă este clară.

fuxia fuxia
25 dec. 2016 20:14:32
0
// î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 );
28 mai 2019 17:57:18
0

Î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');
22 sept. 2021 15:13:20