Unlimited Wordpress themes, plugins, graphics & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Web Design
  2. WordPress

Una guía para anular las funciones de los temas padre en tu tema hijo

by
Read Time:9 minsLanguages:

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

Si tienes alguna experiencia trabajando con temas padres e hijos en WordPress, sabrás que los archivos de plantilla de los temas hijos anulan los del tema padre. Por ejemplo, si el tema principal tiene un archivo page.php y creas uno nuevo en el tema hijo, WordPress utilizará el del tema secundario al mostrar las páginas.

Se podría pensar que las funciones trabajarían de la misma manera: crear una nueva función en el archivo functions.php del tema hijo con el mismo nombre que una del tema padre, y tendrá prioridad. Desafortunadamente, no es tan simple.

En este tutorial, te mostraré tres métodos que puedes usar para anular funciones del tema padre en el tema hijo:

  • funciones pluggables o conectables
  • prioridad de la función
  • quitando funciones del gancho al que están sujetos

Como funcionan las funciones en los temas padres e hijos

Antes de examinar los métodos para anular las funciones en los temas hijos, ayuda el entender cómo funcionan las funciones en los temas de padres e hijos.

En primer lugar, debes saber que todas las funciones de tu tema padre se ejecutarán cuando utilices un tema hijo. No tienes que añadir nada al archivo de funciones del tema hijo para que esto ocurra. Esto es diferente de CSS, donde tienes que incluir manualmente la hoja de estilos del tema padre en la hoja de estilos del tema hijo.

Otra cosa que hay que saber es que, si los temas padre e hijo tienen funciones con el mismo nombre, esto romperá el sitio, a menos que la función del tema padre sea una función pluggable (más sobre esto en breve). Por eso es importante utilizar prefijos para todas las funciones y usar un prefijo diferente en los temas padre e hijo, por si acaso.

Sin embargo, puedes cambiar el orden en que se disparan las funciones, y puede evitar que las funciones se disparen por completo, como veremos en breve.

Funciones pluggables o conectables

Las funciones conectables son algo que se codifica en el tema padre, por lo que no te servirán de nada si trabajas con un tema principal existente que no las tiene.

Pero si estás escribiendo tu propio tema principal, tal vez como punto de partida para futuros proyectos, o si estás creando tu propio marco de trabajo (framework) de temas, es una buena práctica hacer que tus funciones sean conectables para que pueda anularlas fácilmente en los temas secundarios. También es una buena idea revisar las funciones que se escriben en el tema padre que estás usando, ya que muchas de ellas, incluyendo el tema predeterminado de WordPress, tendrán funciones conectables.

Para escribir una función pluggable, simplemente enciérrala en una etiqueta condicional para comprobar si una función con ese nombre ya ha sido ejecutada:

Así que si encierras las funciones en tu tema padre en una etiqueta condicional como esta, WordPress comprobará si hay una función con el mismo nombre en tu tema hijo que ya se haya ejecutado, y si es así, no ejecutará la función del tema padre.

Entonces, cuando escribas una función en el tema hijo que quieres anular del tema padre, le das el mismo nombre que el del tema padre:

WordPress ejecutará primero la función en el tema hijo, y cuando se trate de la del tema padre, comprobará si ya existe y porque lo hace, no la ejecutará.

Prioridad de la función

Si no utilizas tu propio tema principal, o si utilizas uno de terceros sin funciones conectables, necesitarás otro método.

Cuando escribes funciones, puedes asignarles una prioridad, lo que le dice a WordPress cuándo ejecutarlas. Esto lo haces cuando añades tu función a un gancho de acción o de filtro. WordPress ejecutará entonces las funciones adjuntas a un gancho dado en orden de prioridad ascendente, de modo que las que tengan números más altos serán las últimas en ejecutarse.

Imaginemos que la función en el tema padre no es conectable, y se ve así:

Esta función está conectada al gancho de inicio y no se le ha dado prioridad. De forma predeterminada, WordPress asigna una prioridad de 10 a las funciones a las que no se les ha añadido una prioridad, así que para disparar tu función después de ella, utiliza un número mayor de 10. Tiendo a usar el 15 para tener un poco de espacio para respirar en caso de que quieras añadir otra función entre los dos más tarde.

Esto significa que la función en el tema hijo se vería así:

Alternativamente, la función en tu tema principal puede haber tenido una prioridad asignada:

Así que solo tienes que asegurarte de que la prioridad que le das a la función en el tema hijo es mayor:

Eliminar las funciones de los ganchos

A veces, ejecutar otra función después de la primera no es suficiente para anularla: hay que asegurarse de que la función del tema principal no se ejecute en absoluto. En este caso, puedes eliminar la función del tema padre del gancho al que está conectada, usando las funciones remove_action() o remove_filter(). El que se utilice dependerá de si la función está conectada a un gancho de acción o a un gancho de filtro en el tema principal.

Así que volvamos a nuestra función anterior en el tema padre:

Para eliminar esta función de tu gancho de acción y, por lo tanto, evitar que se dispare, se crea una función en el tema hijo para eliminarla usando remove_action():

Sin embargo, esto no funcionará por sí solo, es necesario conectar esta función a un gancho que se dispare después del gancho al que está conectada la función del tema principal. Esto se debe a que no puedes quitar la acción antes de que haya sido disparada. Puedes encontrar detalles del orden en que se disparan las acciones en el Codex.

Una vez que hayas hecho esto, puedes simplemente escribir una función alternativa para reemplazar la función del tema padre en el archivo de funciones del tema hijo, o no puedes hacer nada si todo lo que querías era eliminar la función del tema padre.

Una nota sobre las prioridades

Ten en cuenta que si estás intentando eliminar una función mediante remove_action() o remove_filter() y la función tiene una prioridad asignada, debes incluir la prioridad al eliminarla, o no funcionará.

Así que si la función en el tema padre se ve así:

... tendrás que incluir el mismo valor de prioridad cuando lo elimines:

Funciones avanzadas para temas padres e hijos: Funciones conectables y funciones de extensión

Además de lo anterior, hay algunos escenarios específicos en los que podrías querer llevar las cosas más lejos. Los siguientes consejos son en respuesta a las preguntas que se han planteado en los comentarios que aparecen a continuación.

Cómo anular parcialmente una función en el tema padre

Estrictamente hablando, no puedes anular parcialmente una función. Solo puedes dejar que se ejecute o desactivarla. Pero hay soluciones alternativas.

La primera es la función que deseas anular parcialmente contiene funciones que son conectables. Es posible que la función incluya una llamada a otra función conectable desde el tema principal.

Si este es el caso, puedes anular cualquier función dentro de la función principal, si ese es el código que quieres cambiar. Hazlo escribiendo una nueva versión de la función conectable que o bien contiene solo una declaración de return o contiene un código alternativo. Ten en cuenta que esto solo funcionará si la función es conectable, si no lo es, tu sitio se romperá.

Sin embargo, este método solo funciona si tienes la suerte de tener que anular la funcionalidad dentro de una función que es proporcionada por otra función contenida y conectable.

En la gran mayoría de los casos, esto no será una opción. En estos casos, tendrás que desactivar la función y reemplazarla por una función propia, con un nombre diferente. Para crear una nueva función, puedes copiar y pegar la función del tema padre en el archivo functions.php del tema hijo, y luego editarlo para eliminar el código que no quieras.

Usarías dos de tus propias funciones: una para eliminar la original, y la segunda para proporcionar un nuevo código, como este ejemplo anulando un tema padre llamado "init hook":

Como anular las funciones no conectables

Las funciones en el tema padre que no son conectables no pueden ser anuladas de ninguna manera especial. Así que tendrías que usar el método anterior, quitando la función de su gancho de acción y escribiendo una nueva función en el mismo gancho de acción que proporciona el nuevo código.

No le des a la función del tema hijo el mismo nombre que a la función del tema padre ya que esto ¡romperá tu sitio!

Como ampliar las funciones de los temas padres

Por lo general, las funciones no están diseñadas para ser extensibles. Sin embargo, puede haber una excepción si tu función incluye llamadas a otras funciones conectables.

En este caso, se puede ampliar la función anulando las funciones dentro de la función principal, sin tener que sustituir la totalidad de la función principal.

En la mayoría de los casos, solo se puede ampliar una función de tema padre de una de las tres maneras:

  • Si la función que quieres ampliar es conectable, cópiala en el tema hijo y añade un código extra para ampliarla.
  • Si la función no es conectable, quítala de tu gancho usando remove_action() y escribe una nueva función (con un nombre diferente) en el mismo gancho con un código extra. Puede que quieras copiar el código de la función original en tu nueva función y editarla.
  • Escribe una segunda función que se llama en el mismo gancho que la primera función y añade un código extra que se ejecutará antes o después de la primera función. Utiliza el parámetro de prioridad en add_action() para especificar si tu segunda función se ejecutará antes o después de la función original.

Resumen

Anular las funciones en un tema principal es más complicado que anular los archivos de plantilla o el estilo, pero se puede hacer. Aquí te he mostrado tres métodos para hacerlo:

  • Si estás escribiendo tu propio tema padre, o usando uno que los tenga, utiliza funciones conectables para que una función del tema hijo con el mismo nombre que una del tema padre lo sustituya.
  • Asigna prioridades más altas a las funciones de los temas hijos para asegurarte de que se ejecuten después de las del tema padre.
  • Utiliza remove_action() o remove_filter() para eliminar completamente las funciones del tema principal.

El método que utilices dependerá de la forma en que esté codificado el tema principal y de si necesitas eliminar la función del tema principal por completo o simplemente ejecutar otra función después para anularlo. 

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.