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.
Gergely
Informații despre hook-uri/filtre în WordPress: https://codex.wordpress.org/Plugin_API
Jonathan Hult
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?
Victor
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' );