Redefiniți o funcție într-un child theme
Vreau să redefinesc o funcție pe care am moștenit-o din tema părinte.
Când încerc să fac asta în functions.php, primesc o eroare fatală care spune că redeclararea nu este posibilă.
Am găsit o soluție temporară: am creat un nume modificat pentru funcție și am copiat toate fișierele de șablon, index.php etc. în directorul child theme-ului, apoi am rescris apelurile funcției. Acum noua funcție este apelată.
Această soluție funcționează, dar ignoră orice actualizări pe care le-ar putea avea tema părinte.
Există o soluție mai bună pentru această problemă?

Redefinirea unei funcții într-un temă copil funcționează doar atunci când funcția din tema părinte este încadrată într-o condiție
if( !function_exists( 'nume_functie' )):
. În acest caz, puteți pur și simplu copia întreaga funcție în tema copil și faceți modificările necesare.
Dacă funcțiile din tema părinte nu sunt încadrate în acea condiție if
, iar dacă nu sunt furnizate filtre sau hook-uri în funcție, cel mai bine este să copiați funcția în tema copil, să o redenumiți, să faceți modificările necesare și apoi să actualizați fișierele de șablon în consecință pentru a reflecta noua funcție.

Exact asta am făcut. Acum îmi dau seama că este o problemă a php, deoarece nu permite redeclararea așa cum face javascript.

Informații despre hook-uri/filtre în WordPress: https://codex.wordpress.org/Plugin_API

Dar funcția nu va fi suprascrisă de o actualizare a temei? Poate nu înțeleg pașii pe care i-ai menționat - voi repeta: copiez funcția pe care vreau să o actualizez și redenumesc funcția originală. Apoi, când actualizez tema, funcția originală va fi redenumită din nou la numele ei inițial. Omiteam ceva?

Puteți întâi să eliminați funcția cu
remove_filter( 'hook', 'function_name' );
și apoi să adăugați din nou funcția cu noul nume și același hook.
De exemplu
function remove_content_filter() {
remove_filter( 'the_content', 'function_name' );
}
add_action( 'after_setup_theme', 'remove_content_filter' );
function new_function_name( $output ) {
//aici poți adăuga codul
return $output;
}
add_filter( 'the_content', 'new_function_name' );
