Ridefinire una funzione in un child theme
Voglio ridefinire una funzione che ho ereditato dal tema genitore.
Quando lo faccio in functions.php, ottengo un errore fatale che indica che la ridefinizione non è possibile.
Ho trovato una soluzione alternativa: creare un nome di funzione modificato e copiare tutti i file template, index.php ecc. nella directory del child theme e riscrivere le chiamate alla funzione. Così ora viene chiamata la nuova funzione.
Questo funziona ma ignora eventuali aggiornamenti che avrebbe il tema genitore.
Esiste una soluzione migliore per questo problema?

Ridefinire una funzione in un child theme funziona solo quando la funzione del tema genitore è racchiusa in una condizione
if( !function_exists( 'function_name' )):
. In questo caso, puoi semplicemente copiare l'intera funzione nel child theme e apportare le modifiche necessarie.
Se le funzioni del tema genitore non sono racchiuse in questa istruzione condizionale if
, e se non sono forniti filtri o hook nella funzione, sarà meglio copiare la funzione nel tuo child theme, rinominare quella funzione, apportare le tue modifiche e poi aggiornare i tuoi file template di conseguenza per riflettere la nuova funzione.

È esattamente quello che ho fatto. Ora capisco che è un limite di PHP in quanto non permette la ridefinizione delle funzioni come invece fa JavaScript.

Informazioni sugli hook/filter di WordPress: https://codex.wordpress.org/Plugin_API

Ma la funzione non verrà sovrascritta da un aggiornamento del tema? Forse non ho capito bene i passaggi che hai detto - ripeto: copio la funzione che voglio modificare e rinomino la funzione originale. Poi, quando aggiorno il tema, la funzione originale verrà rinominata nuovamente con il suo nome originario. Mi sfugge qualcosa?

Puoi prima rimuovere la funzione con
remove_filter( 'hook', 'function_name' );
e poi aggiungere nuovamente la funzione con il nuovo nome e lo stesso hook.
Ad esempio
function remove_content_filter() {
remove_filter( 'the_content', 'function_name' );
}
add_action( 'after_setup_theme', 'remove_content_filter' );
function new_function_name( $output ) {
//qui del codice
return $output;
}
add_filter( 'the_content', 'new_function_name' );
