Come sovrascrivere i file JavaScript nel tema figlio?


35

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

scripts > custom.js

Nel tema figlio, sto creando lo stesso percorso ( scripts > custom.js) e cambiando parte del jQuery all'interno del custom.jsfile.

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


1
Qual è il tema principale? Come vengono chiamati gli script dal tema principale?
Chip Bennett,

Risposte:


51

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

Il modo corretto di aggiungere script a WordPress è con wp_enqueue_script . Se il tuo tema principale lo utilizza, puoi sovrascrivere i file JS usando wp_dequeue_script e accodando il tuo.

Così...

<?php
// hook in late to make sure the parent theme's registration 
// has fired so you can undo it. Otherwise the parent will simply
// enqueue its script anyway.
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 principale non utilizza wp_enqueue_script, probabilmente si collega a wp_head (o wp_footer) per echeggiare gli script lì. Quindi useresti remove_action per sbarazzarti di quelle funzioni che fanno eco agli script e quindi accodare il tuo script.

Se lo script è codificato nel file modello, sarà sufficiente sostituire quel file modello nel tema figlio senza il tag script.

Se hanno usato chiamate wp_enqueue_script che utilizzano get_stylesheet_directory_uri , non dovresti fare nulla. Dal momento che ciò non accade, dovrai solo curiosare e vedere cosa ha fatto l'autore del tema.


2
se gli usi tema genitore get_stylesheet_directory_uri agli script di accodamento, quindi il tema bambino avere duplicare tutti gli script quindi accodate, perché altrimenti woun't essere trovati. Non esiste alcun meccanismo di fallback in get_stylesheet_directory_uri per verificare se esiste un singolo file nel tema figlio e, se necessario, tornare al file del tema principale.

Dal codice: “wp_print_scripts non deve essere usato per accodare stili o script in prima pagina. Utilizzare invece wp_enqueue_scripts. ” Codex.wordpress.org/Plugin_API/Action_Reference/…
Christian Lescuyer

Tieni presente quando è stato scritto: due anni fa. Prima wp_enqueue_scriptspoteva essere usato solo per accodare gli script sul front-end. Aggiornato. Se vedi qualcosa di obsoleto, sentiti libero di modificare.
chrisguitarguy,

4
Si noti che potrebbe essere necessario impostare una priorità in ritardo (ad esempio 100) per assicurarsi che il dequeue avvenga dopo l'accodamento del tema principale. add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 ); da codex.wordpress.org/Function_Reference/wp_dequeue_script
Spone

4
Aggiornamento per il 2016: secondo stackoverflow.com/questions/23507179/… dobbiamo anche usare wp_deregister_script('parent-script-handle');per rimuovere completamente lo script principale. In effetti, non ha funzionato per me senza di essa. WP 4.6.1
PhiLho,

1

In alcuni casi è importante dare priorità sia alla funzione 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 genitore con una priorità di 20120206 (la data) e quindi questa azione viene aggiunta con una priorità appena appena maggiore in modo che venga immediatamente rimossa. Quindi, l'istruzione enqueue che segue che segue è in realtà prioritaria dopo quella per garantire che si carichi dopo che la vecchia è stata rimossa. Il vero, in questo caso è anche importante perché questo specifica che deve essere accodato nel piè di pagina, che è dove lo script genitore è stato accodato per la prima volta.

Inoltre, non riesco a spiegarlo del tutto, ma noto che se stai attento a dequequare lo script iniziale immediatamente dopo che è stato accodato, sembra che tu possa effettivamente impedirne il caricamento in primo luogo.


1
La funzione wp_enqueue_scriptnon ha un parametro di priorità, è solo un numero di versione 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,

1

chiama wp_deregister_script prima di registrare la tua versione


1
Perché? Ciò è necessario solo quando si utilizza lo stesso handle, cosa che non è necessario. Probabilmente non dovresti nemmeno farlo, perché è più facile eseguire il debug del codice la cui origine è chiara.
fuxia

1
// enqueue your required script file
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' ) );
}

// dequeue your required script file
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 );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.