Redefinir una función en un tema hijo
Quiero redefinir una función que heredé del tema padre.
Cuando lo hago en functions.php, obtengo un error fatal que indica que la redeclaración no es posible.
Hice una solución alternativa: crear un nombre de función modificado y copiar todos los archivos de plantilla (index.php, etc.) en el directorio del tema hijo, reescribiendo las llamadas a la función. Así ahora se llama a la nueva función.
Esto funciona pero ignora cualquier actualización que pueda tener el tema padre.
¿Existe una mejor solución para esto?
Redefinir una función en un tema hijo solo funciona cuando la función del tema padre está envuelta en una condición:
if( !function_exists( 'nombre_de_la_funcion' )):
Entonces puedes simplemente copiar la función completa al tema hijo y realizar las modificaciones que necesites.
Si las funciones del tema padre no están envueltas en esa sentencia condicional if
, y si no hay filtros o hooks disponibles en la función, lo mejor será copiar la función a tu tema hijo, renombrar esa función, hacer tus modificaciones y luego actualizar tus archivos de plantilla para reflejar la nueva función.

Eso es exactamente lo que hice. Ahora veo que esto es una limitación de PHP ya que no permite redeclaración como sí lo hace JavaScript.

Información sobre hooks/filters de WordPress: https://codex.wordpress.org/Plugin_API

¿Pero no será sobrescrita la función al actualizar el tema? Quizás no entiendo los pasos que mencionaste - lo repito: copio la función que quiero actualizar y renombro la función original. Luego, cuando actualizo mi tema, la función original será renombrada nuevamente a su nombre original. ¿Me estoy perdiendo algo?

Puedes primero eliminar la función con
remove_filter( 'hook', 'function_name' );
y luego agregar la función nuevamente con el nuevo nombre y el mismo hook.
Por ejemplo
function remove_content_filter() {
remove_filter( 'the_content', 'function_name' );
}
add_action( 'after_setup_theme', 'remove_content_filter' );
function new_function_name( $output ) {
//algún código aquí
return $output;
}
add_filter( 'the_content', 'new_function_name' );
