Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress
Code

Una guía para la sobre escritura de funciones de los temas padres de su tema hijo

by
Difficulty:IntermediateLength:ShortLanguages:

Spanish (Español) translation by Eva Collados Pascual (you can also view the original English article)

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:

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:

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:

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:

Igualmente, la función de tu tema padre podría tener una prioridad asignada:

Así que sólo tienes que asegurarte de que la prioridad que das a la función en tu tema hijo es superior:

Eliminar las Funciones de los Hooks

En ocasiones, ejecutar otra función tras las primera no es suficiente para sobrescribirla - tendrás que asegurarte de que la función del tema padre no se ejecuta realmente. En este caso, puedes eliminar la función del hook en la que está incluída en el tema padre usando las funciones remove_action() o remove_filter(). Debes usar la que corresponda, dependiendo de si la función está conectada en el tema padre a un hook de acción o a uno de filtro.

Volvamos a nuestra función en el tema padre:

Para eliminar esta función de su hook de acción y por tanto evitar que se ejecute, debes crear una función para eliminarla en tu tema hijo usando remove_action():

Sin embargo, esto no funcionara por sí solo - tienes que conectar la función a un hook que se dispare tras el hook que contiene la función en el tema padre. La explicación a esto es que no puedes eliminar la acción si antes no ha sido disparada. Puedes consultar más información sobre el orden en el que se ejecutan las acciones en el Codex.

Una vez hayas hecho esto, escribe simplemente una función alternativa que sustituya la función del tema padre en el archivo functions de tu tema hijo, o también podrías no hacer nada en caso de que lo único que quieras sea eliminar la funcionalidad en el tema padre.

Una Nota sobre las Prioridades

Observa como si estás intentando eliminar una función usando remove_action() o remove_filter() y debes asignar una prioridad al eliminarla, si no lo haces no lograrás eliminarla.

Por tanto, si la función de tu tema padre tiene el siguiente aspecto:

…tendrás que incluir el mismo valor en la prioridad para eliminarla:

Resumen

Resumen Sobreescribir funciones en un tema padre es más complicado que sobreescribir archivos o estilos, pero es algo posible. Aquí te he mostrado tres métodos para conseguirlo:

  • Si estás escribiendo tu propio tema padre, o usando uno que lo tiene, utiliza funciones conectables de manera que las funciones en el tema hijo con el mismo nombre que las del tema padre sean sustituibles.
  • Asigna prioridades más altas a las funciones en tus temas hijo para asegurarte de que serán ejecutadas después de las correspondientes en el tema padre.
  • Usa remove_action() o remove_filter() para eliminar por completo cualquier función de tu tema padre.

El método que uses dependerá de la forma en la que esté construido tu tema padre y de si necesitas eliminar completamente la función del tema padre o solo ejecutar otra función tras aquella para sobreescribirla.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.