Come sovrascrivere i file JavaScript nel tema child?

25 ago 2011, 01:14:24
Visualizzazioni: 75.3K
Voti: 43

Sto caricando alcuni file JavaScript nel tema parent. Il percorso nel tema parent è:

scripts > custom.js

Nel tema child, sto creando lo stesso percorso (scripts > custom.js) e modificando parte del jQuery all'interno del file custom.js.

Il problema è che le modifiche non vengono applicate. È questo il modo sbagliato di apportare modifiche a questi file nel tema child?

1
Commenti

Cos'è il Tema genitore? Come vengono chiamati gli script dal Tema genitore?

Chip Bennett Chip Bennett
25 ago 2011 01:17:34
Tutte le risposte alla domanda 5
9
60

I temi child sovrascrivono solo i file php (come header.php) che sono inclusi con funzioni come get_template_part o get_header, ecc.

Il modo corretto per aggiungere script a WordPress è con wp_enqueue_script. Se il tuo tema parent utilizza questa funzione, puoi sovrascrivere i file JS usando wp_dequeue_script e caricando i tuoi.

In questo modo...

<?php
// agganciati tardi per assicurarti che la registrazione del tema parent 
// sia avvenuta così puoi annullarla. Altrimenti il tema parent 
// caricherà comunque il suo script.
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'));
}

Se il tema parent non utilizza wp_enqueue_script, probabilmente si aggancia a wp_head (o wp_footer) per visualizzare gli script lì. Quindi dovresti usare remove_action per rimuovere quelle funzioni che visualizzano gli script, e poi caricare il tuo script.

Se lo script è hard-codato nel file del template, dovrai semplicemente sostituire quel file template nel tuo tema child senza il tag script.

Se hanno usato chiamate wp_enqueue_script che utilizzano get_stylesheet_directory_uri, allora non dovresti dover fare nulla. Dato che questo non sta accadendo, dovrai solo esplorare e vedere cosa ha fatto l'autore del tema.

25 ago 2011 01:27:39
Commenti

se il tema genitore utilizza get_stylesheet_directory_uri per accodare gli script, allora il tema figlio dovrà duplicare tutti gli script così accodati, perché altrimenti non verranno trovati. Non esiste un meccanismo di fallback in get_stylesheet_directory_uri per verificare se un singolo file esiste nel tema figlio e, se necessario, ricadere sul file del tema genitore.

User User
26 lug 2012 16:20:01

Dal Codex: "wp_print_scripts non dovrebbe essere utilizzato per accodare stili o script nella pagina frontale. Usa invece wp_enqueue_scripts." http://codex.wordpress.org/Plugin_API/Action_Reference/wp_print_scripts

Christian Lescuyer Christian Lescuyer
13 ago 2013 17:53:02

Tieni presente quando è stato scritto: due anni fa. Prima che wp_enqueue_scripts potesse essere utilizzato per accodare script solo nel front end. Aggiornato. Se vedi qualcosa di obsoleto, sentiti libero di modificare.

chrisguitarguy chrisguitarguy
13 ago 2013 18:02:49

Scusa, nessuna critica implicita, ho votato positivamente la tua risposta :)

Christian Lescuyer Christian Lescuyer
16 ago 2013 22:46:47

Nota che potresti dover impostare una priorità alta (ad esempio 100) per assicurarti che il tuo dequeue avvenga dopo l'enqueue del tema genitore.

add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 );

da http://codex.wordpress.org/Function_Reference/wp_dequeue_script

Spone Spone
4 set 2014 08:18:24

Aggiornamento per il 2016: secondo http://stackoverflow.com/questions/23507179/wp-dequeue-script-for-child-theme-to-replace-script dobbiamo anche usare wp_deregister_script('parent-script-handle'); per rimuovere completamente lo script del genitore. Infatti, non ha funzionato per me senza questo passaggio. WP 4.6.1

PhiLho PhiLho
30 nov 2016 11:58:14

puoi rispondere alla mia domanda qui per favore? Questa risposta è un po' confusa:https://wordpress.stackexchange.com/questions/286957/modifying-js-files-in-child-theme

csandreas1 csandreas1
26 nov 2017 11:59:20

@PhiLho, sto usando la versione 5.4, e wp_dequeue_script() ha funzionato per me da solo. Il tema genitore aveva wp_enqueue_script( 'fitvids', get_template_directory_uri() . '/js/fitvids.js', array( 'jquery' ), '1.1', true ); -- forse dipende dal modo in cui lo script era caricato dal tema genitore?

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

@PhiLho, ho anche aggiunto wp_deregister_script, questo non ha cambiato nulla, ma forse ha liberato della memoria inutilmente occupata dalla registrazione dello script. Ho anche dovuto aggiungere due azioni per 'wp_enqueue_scripts', la priorità predefinita per caricare il mio foglio di stile sostitutivo, ma per eliminare lo script ne ho aggiunto un'altra, con priorità 100, come suggerito dalla risposta. Ma il fatto che non abbia funzionato non può essere spiegato dal problema dell'ordine di caricamento, perché nel mio caso, la rimozione o la deregistrazione nel hook a priorità normale generava solo errori nel log. Strano, in ogni caso.

kkm mistrusts SE kkm mistrusts SE
5 apr 2020 06:04:34
Mostra i restanti 4 commenti
1

In alcuni casi è importante dare priorità sia alla chiamata add_action che alla funzione wp_enqueue_script in questo modo:

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);
}

In questo caso, wp_enqueue_scripts è stato chiamato dal tema genitore con una priorità di 20120206 (la data) e quindi questa azione viene aggiunta con una priorità leggermente superiore in modo che venga immediatamente rimossa dalla coda. Successivamente, l'istruzione enqueue che segue è effettivamente prioritaria rispetto alla precedente per garantire che venga caricata dopo che la vecchia è stata rimossa dalla coda. Il valore true, in questo caso, è importante anche perché specifica che lo script deve essere accodato nel footer, che è dove lo script del tema genitore era stato originariamente accodato.

Inoltre, non riesco a spiegarlo completamente, ma ho notato che se si rimuove con attenzione lo script iniziale subito dopo che è stato accodato, sembra che si possa effettivamente impedire che venga caricato del tutto.

11 nov 2015 03:24:10
Commenti

La funzione wp_enqueue_script non ha un parametro di priorità, è solo un numero di versione che viene concatenato alla fine del percorso come stringa di query. Questo parametro viene utilizzato per garantire che la versione corretta venga inviata al client indipendentemente dalla cache [...]

Emile Bergeron Emile Bergeron
18 gen 2016 16:51:50
1

chiama wp_deregister_script prima di registrare la tua versione

25 dic 2016 17:17:08
Commenti

Perché? Questo è necessario solo quando si utilizza lo stesso handle – qualcosa che non sei obbligato a fare. Probabilmente non dovresti neanche farlo, perché è più semplice eseguire il debug di un codice la cui origine è chiara.

fuxia fuxia
25 dic 2016 20:14:32
0
// carica il tuo file script necessario
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' ) );
}

// rimuovi il caricamento del tuo file script
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 mag 2019 17:57:18
0

Dalla versione 4.7 di WordPress puoi utilizzare 'get_theme_file_uri()' che cercherà prima nella cartella del tema figlio e successivamente in quella del tema genitore. In questo modo, il file presente nel tema figlio avrà la priorità.

   wp_enqueue_script('custom-js', get_theme_file_uri() . '/scripts/custom.js');
22 set 2021 15:13:20