Come sovrascrivere i file JavaScript nel tema child?
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?

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.

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.

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

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.

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

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

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

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

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

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

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.

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

chiama wp_deregister_script prima di registrare la tua versione

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

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