Si tienes alguna experiencia trabajando con temas padre y temas hijo, más conocidos como “child themes” en WordPress, ya sabrás que los archivos de plantilla de tu tema hijo sobreescriben a sus homólogos en el tema padre. De manera que, por ejemplo, si tu tema padre tiene un archivo page.php
y creas uno nuevo en tu tema hijo, WordPress usará éste último cuando muestre las páginas.
Podrías pensar que pasa lo mismo con las funciones: crea una nueva función en tu archivo functions.php
con el mismo nombre que la que la perteneciente al tema padre, de manera que tome preferencia. Por desgracia, no es tan simple como esto.
En este tutorial te mostraré los tres métodos que puedes usar para sobrescribir funciones de un tema padre en tu tema hijo:
- Funciones conectables/insertables.
- Prioridad de la función.
- Eliminar funciones del hook al que están conectadas.
Cómo funcionan las funciones en el tema padre e hijo
Antes de examinar los métodos para sobreescribir las funciones de tu tema hijo, es útil entender cómo funcionan las funciones en los temas padre e hijo.
Primero, tienes que saber que todas las funciones de tu tema padre se ejecutarán cuando estés usando un tema hijo. No tienes que añadir nada en el archivo de las funciones de tu tema hijo para que esto ocurra. Es distinto a CSS, en donde tienes que incluir manualmente la hoja de estilo de tu tema padre en la de tu tema hijo para que incluya sus estilos.
Las funciones de tu tema hijo se cargarán antes de que se carguen las del tema padre. Esto significa que si tu tanto tu tema padre como tu tema hijo tienen funciones llamadas my_function()
que realizan un trabajo similar, la del tema padre se ejecutará en último lugar, por tanto sobreescribirá la del tema hijo.
Sin embargo, puedes cambiar el orden en el que se desencadenan las funciones, e incluso puedes evitar que lo hagan como veremos en breve.
Funciones insertables
Las funciones conectables son algo que tu creas con código en tu tema padre de manera que no tendrán ninguna utilidad para ti si estás trabajando con un tema padre que no las tiene.
Pero si estás escribiendo tu propio tema padre, quizá como punto de inicio para proyectos futuros, o si estás creando tu propio framework, hacer que tus funciones sean insertables o “pluggable” para que puedas posteriormente sobrescribirlas en tu tema hijo es una práctica buena y aconsejable. También es buena idea echar un vistazo a las funciones de tu tema padre que estés usando, ya que muchas de ellas, incluyendo el tema predeterminado de WordPress, tendrán funciones conectables.
Para escribir funciones conectables, simplemente enciérralas entre etiquetas condicionales para comprobar si ya se está ejecutando otra función con ese nombre:
1 2 3 4 5 6 7 |
<?php if ( ! function_exists ( 'my_function' ) ) { function my_function() { // Contents of your function here. } } ?> |
Si encierras las funciones en tu tema padre dentro de etiquetas condicionales, WordPress comprobará si existe una función con el mismo nombre en tu tema hijo que ya haya sido ejecutada, y si es así, no ejecutará la función del tema padre.
Después, cuando vayas a escribir una función en tu tema hijo que quieras que sobreescriba su correspondiente en el tema padre, simplemente tendrás que asignarle el mismo nombre que tiene la función del tema padre:
1 2 3 4 5 |
<?php function my_function() { // Contents for your function override here. } ?> |
WordPress ejecutará primero la función del tema hijo, y en lo que respecta a su homóloga en el tema hijo, comprobará si existe y en ese caso, no la ejecutará.
Prioridad de la función
Si no estás usando tu propio tema padre, o si estás usando uno creado por terceros que no incluye funciones conectables, puedes usar otro método.
Cuando creas funciones puedes asignarles una prioridad, esto le indicará a WordPress cuando debe ejecutarlas. Haces esto mismo cuando añades tu función al hook de una acción o filtro. Entonces WordPress ejecutará la función conectada a un hook dado en orden ascendente de prioridad, de manera que aquellas que tengan una cifra de valor más alto se ejecutará en último lugar.
Imagina que la función del tema padre no es conectable y que tiene el siguiente aspecto:
1 2 3 4 5 6 |
<?php function parent_function() { // Contents for your function here. } add_action( 'init', 'parent_function' ); ?> |
Esta función está conectada al hook init
y no se le ha asignado ninguna prioridad. Por defecto WordPress asigna una prioridad 10
a las funciones a las que no se les ha asignado ninguna, por tanto, para disparar tu función después tendrás que usar un valor superior a 10
. Yo suelo usar 15
, así tengo cierto margen en caso de que quiera añadir posteriormente otra función entre ambas.
Esto significa que la función de tu tema hijo tendrá ahora el siguiente aspecto:
1 2 3 4 5 6 |
<?php function child_function() { // Contents for your function here. } add_action( 'init', 'child_function', 15 ); ?> |
Igualmente, la función de tu tema padre podría tener una prioridad asignada:
1 2 3 4 5 6 |
<?php function parent_function() { // Contents for your function here. } add_action( 'init', 'parent_function', 20 ); ?> |
Así que sólo tienes que asegurarte de que la prioridad que das a la función en tu tema hijo es superior:
1 2 3 4 5 6 |
<?php function child_function() { // Contents for your function here. } add_action( 'init', 'child_function', 25 ); ?> |
Lo que te queda por leer:
-
Eliminar las funciones de los hooks
-
Una Nota sobre las Prioridades
-
Deja una respuesta