Sala de control, de Patryk Gradys

Tanto para empezar a desarrollar tus propios temas o plugins para WordPress, como para editar el código de aquellos que ya estás usando hoy, saber escribir funciones en PHP es básico.

Si te limitas a copiar y pegar el código que encuentras por Internet, puedes llegar a experimentar situaciones muy frustrantes: el código no funciona como tu quieres, se rompen funcionalidades de tu web, o incluso sin tener ni idea estás comprometiendo la seguridad de tu instalación.

Y lo peor de todo es que no sabes porqué pasan estas cosas, especialmente si no entiendes el fragmento de código que estás copiando y pegando. Esto es algo a evitar siempre. Y para ponerle remedio, no nos queda otra que aprender.

Para ayudarte a mejorar tus habilidades en WordPress aquí tienes un pequeño tutorial para aprender a escribir funciones PHP y a ejecutarlas en tu WordPress.

Voy a intentar que sea todo lo más sencillo posible. ¿Lo conseguiré? Veamos…

Instrucciones para escribir una función en WordPress

Para poder ejecutar una función en WordPress lo primero que has de hacer es programarla. Y esto quiere decir escribirla allí dónde toque. Veamos cómo lo hacemos.

Qué necesitamos

En principio, para escribir una función en PHP en tu WordPress no necesitas nada adicional. A no ser que tengas los permisos limitados o tu usuario tenga un rol que no sea administrador, desde el propio WordPress puedes editar el archivo functions.php de tu tema. Ve al menú Apariencia, luego a Editor de temas, y allí podrás editar este archivo.

¡Ojo! Con esto no quiero decir que meter código en el archivo functions.php sea la mejor opción. De hecho, puede ser un desastre total si el código que metes tiene errores, ya que sufrirás el pantallazo blanco y tu web dejará de funcionar hasta que lo arregles. Recuerda que suele ser mucho mejor meter tu código en un plugin.

Editor de temas de WordPress.
Editor de temas de WordPress.

Si quieres ser un desarrollador con todas las letras, necesitarás un editor de código y una instalación de WordPress de pruebas. Para la instalación local de WordPress puedes usar Local by Flywheel, que es bastante sencilla de usar. Si eres más pro puedes intentar usar Lando, pero tampoco hace falta que te compliques demasiado ahora.

En cuanto al editor de código, puedes usar desde un editor de texto cualquiera (sin formato) hasta algo más profesional como Atom o VisualStudio Code. Por cierto, yo ahora uso este último y estoy encantado.

Por último, si no utilizas una instalación de WordPress local y quieres editar los archivos PHP de tu servidor, necesitarás un cliente de FTP para poder acceder a estos. En esta entrada te explico unos cuantos.

Documenta tú código

Crear documentación en tu código es algo que, te guste o no, debes hacer. Ya no por los demás que tengan que leer tu código algún día, sino por tu yo del futuro, que seguro que se olvida de qué hiciste y te lo agradecerá cuando tenga que revisar código antiguo.

Para escribir documentación en una función te recomiendo que utilices el estándar PHPDoc o DocBlock, tal y como se indica aquí.

Imagínate que quieres enviar un email cada vez que se publica una entrada en tu WordPress. En tal caso, deberías poner un comentario como el siguiente:

Fíjate que los comentarios están definidos dentro de unos caracteres especiales /**/. Si utilizas un editor de código seguramente ya se encargue este de completarte los asteriscos en cada salto de línea.

En el comentario anterior primero en una frase corta definimos la intencionalidad de la función: qué va a hacer. Luego, podemos utilizar una descripción larga explicando en más detalle lo que la función realiza.

Por otro lado, el código lo puedes comentar en tu propio idioma, no hace falta que esté en inglés. No obstante, si los comentarios y todo lo demás ya los escribes en inglés, si luego subes el código a un repositorio público y otros programadores lo ven, les facilitarás la vida para entenderlo.

La cabecera de la función

Una vez tenemos la documentación básica de la función, podemos pasar a escribir su cabecera. Esto es, el nombre de la función junto a los parámetros (si los tuviera) y las llaves que delimitan su ámbito.

Para nuestro ejemplo, podemos hacer lo siguiente:

Fíjate que primero usamos la etiqueta function para indicar que vamos a escribir una función. Luego viene el nombre de la función concreta que estamos escribiendo. Para elegir el nombre de la función, hemos de intentar que este nombre ya sea indicativo de lo que la función va a hacer. En nuestro caso, notificar cuando se publica una entrada. De ahí que tengamos notify_on_post_published.

Como no vamos a liarnos a usar namespaces todavía, lo que tenemos que hacer para evitar que ese nombre de función escogido esté repetido es añadirle un prefijo. Nosotros hemos puesto nelio_, pero tú puedes poner el prefijo que quieras. Eso sí, que sea el mismo en todas tus funciones, así también te servirá para rápidamente identificar aquellas funciones que has desarrollado tú.

Después del nombre de la función tenemos la lista de parámetros entre paréntesis. En esta función nos van a pasar como parámetros el identificador de la entrada $ID y el objeto con los datos de la entrada en $post. Estos parámetros los utilizaremos luego en el cuerpo de la función.

Por último, delimitamos el cuerpo de la función entre llaves, o lo que es lo mismo, los caracteres de apertura y cierre { y }. Aunque no es obligatorio, nosotros nos hemos acostumbrado también a poner un comentario de cierre justo después de }, tal y como puedes ver en la línea 13. Esto nos sirve, en funciones algo más largas y complejas, a saber qué función (o bloque) está cerrando esa llave.

El cuerpo de la función

El cuerpo de la función está compuesto por instrucciones y va dentro de las llaves de apertura y cierre { y }. Veamos el cuerpo de la función, donde preparamos el email y lo enviamos:

Fíjate que las instrucciones terminan con el símbolo de punto y coma en PHP. Hay tres bloques de instrucciones, cada uno de ellos con un comentario inicial explicando lo que se va a hacer.

En el primer bloque metemos en la variable $message el contenido del email. En este contenido tenemos también el contenido de la entrada, que se obtiene a través de $post->post_content.

En el segundo bloque preparamos el asunto del email y lo metemos en la variable $subject. En el asunto también metemos el título de la entrada, que obtenemos a partir de $post->post_title.

Por último, hacemos uso de la función de WordPress wp_mail que sirve para enviar un email. Esta función se llama utilizando paréntesis y poniendo dentro los parámetros que queramos pasar. Tal y como la documentación indica, primero le pasamos el email del destinatario, luego el asunto y luego el mensaje. Esto lo hacemos pasando primero una cadena de texto con el email y luego las dos variables que hemos estado preparando en las instrucciones anteriores.

Aunque no lo he comentado, ten en cuenta que también hemos documentado los parámetros que nuestra función recibe dentro del bloque DocBlock (líneas 8 y 9). De esta forma, cualquiera entiende que un parámetro es el identificador de la entrada y el otro es un objeto de tipo WP_Post con los datos de la entrada.

Instrucciones para ejecutar una función en WordPress

Aunque hemos sido capaces de escribir una función bastante resultona, la verdad es que no se ejecutará nunca a no ser que hagamos algo más. Veamos ahora como conseguir que nuestro código se ejecute.

Conectando la función con WordPress

Para que nuestra función funcione (no me canso de hacer la broma), hemos de conectarla con un hook de WordPress. Los hooks son acciones o filtros que WordPress ejecuta en un momento dado. Te puedes conectar a ellos para que cuando WordPress los ejecute, tu función se ejecute en ese mismo momento.

Nuestra función envía un email cuando una entrada se publica. Por tanto, tendremos que buscar en WordPress si hay algún hook al que conectarnos que se ejecute cuando se publica una entrada. Y sí, lo hay. Se trata del hook cuyo nombre es publish_post que tienes documentado aquí.

Para conectarnos a este hook hacemos lo siguiente:

Como ves, el código es el mismo de antes pero ahora en la línea 25 hemos añadido la función add_action que se encarga de conectar nuestra función nelio_notify_on_post_published con el hook publish_post.

Siempre se utiliza add_action o add_filter para conectar con hooks de tipo acción o filtro (estos últimos reciben un parámetro y lo devuelven modificado). Ya te hablé hace tiempo de los hooks de WordPress aquí.

Los dos últimos parámetros de add_action indican la prioridad de ejecución de nuestra función (el valor por defecto es 10) y el número de parámetros que hay que pasarle a la función conectada. En el caso del hook publish_post, se pasan dos parámetros; como nuestra función usa el segundo parámetro del hook, tenemos que pasarle los dos parámetros.

Y ya está. Si hacemos esto y vamos al editor de entradas y publicamos una nueva, enviaremos un email a la dirección indicada en nuestra función. Te animo a que lo pruebes e intentes modificar el contenido del email con más información, a modo de práctica.

Saber programar funciones es clave para convertirte en desarrollador de WordPress

Entender cómo funcionan las funciones (valga la redundancia) en WordPress es algo primordial para dar el salto al desarrollo de verdad con WordPress. Filtros y acciones son la herramienta más importante que WordPress proporciona para extender las funcionalidades de la plataforma.

Si has seguido paso a paso todo lo que hemos explicado hoy aquí y lo has entendido, tienes mucho ganado de cara a aumentar tus habilidades con WordPress. Te queda todavía un largo camino por delante, pero seguro que ahora todo es más sencillo.

Hay mil opciones para ganarse la vida con WordPress sin escribir ni una línea de código. ¿Crees que vale la pena aprender a desarrollar en WordPress? Yo creo que sí. Recuerda que puedes dejarme un comentario aquí abajo dándome tu opinión al respecto.

Imagen destacada de Patryk Grądys en Unsplash.

11 respuestas a «Cómo crear una función en WordPress y ejecutarla cuando queramos»

  1. Avatar de RODOLFO SEALES
    RODOLFO SEALES

    Super Nelio. Te felicito por tan excelentes tutoriales. Estoy aprendiendo a programar en la jerga de wordpress( me refiero a su semantica y a su estructura ) y la verdad que tus tutoriales han sido de mucha ayuda e ilustracion en el conocimiento que he ido adquiriendo. Lo importante es complementar los tutoriales que tratan sobre el tema. Me gustaria pudieras desarrollar una serie mas detallada de crear un plugin pero para otro Plugin ya desarrollado, es decir, que modifique el comportamiento de una o varias caracteristicas de el primer plugin. ademas de el uso de addons para dichos plugins. Te invito a hacerlo con el plugin de affiliados AffiliateWP. es lo que estoy persiguiendo en este momento como crear un plugin asi. Por otro lado me gustaria saber si es posible organizar un plugin que utilice funciones de diferentes plugins para adecuarlos en cumplir las funcionalidades de esos plugins en nuestro plugin. O cual seria la mejor manera de aprovechar (reutilizar codigo ya realizado) en nuestro nuevo plugin?

    1. Avatar de Antonio Villegas

      Hola Rodolfo. Para extender un plugin a través de otro existen los hooks, pero depende de que los defina el plugin que quieres extender. Gracias por tu comentario y tu opinión.

      1. Avatar de RODOLFO SEALES POSADA
        RODOLFO SEALES POSADA

        Hola Antonio. Lo que deseo hacer es lo siguiente:
        1. digamos que tengo un plugin que me permite realizar un registro de un nuevo usuario, especificamente este http://shalior.ir/wp-referral-code que permite llevar una referencia por invitacion,luego de esto deseo poder llamar a alguna funcion o un pluglin completo de pagos, para que la persona realice un pago, de una cantidad especifica a traves de una pasarela de pagos, pero sucede que estos dos plugin trabajan diferente. La idea cual es? Poder tomar cada parte de cada plugin, lo cual viene en funciones, en hook , en filter, o lo que sea con wordpress y poder armar con ellos la logica de negocios que yo necesito, sin tener que crear un codigo desde cero para hacer esa logica, sino que si toca hacer codigo, se hagan solo llamados a esas funciones de los plugins ha involucrar para lograr el cometido. es decir, tomar solo partes de cada plugins y de alguna manera irlas llamando de acuerdo a la logica de negocios que se deseea. Espero haber sido explicito

        1. Avatar de David Aguilera

          Hola, Rodolfo. En esencia, y si te he entendido bien, si quieres que un usuario pague una suscripción o lo que sea al darse de alta en tu web, lo que deberás hacer es redireccionarle a la página donde tienes configurado el plugin de pagos. De todas formas, lo que estás intentando hacer no es algo trivial y, como comprenderás, me temo que poco podemos ayudarte a través de un hilo de comentarios 🙁 En fin, te deseo mucha suerte. ¡Saludos!

  2. Avatar de Javier Camacaro
    Javier Camacaro

    Hola Nelio. Gran tutorial!

    Una pregunta: Como hago para declarar una variable en wordpress ($Idioma=»ESP» o $Idioma=»ING»)) y que luego sea leída por un Snippet que tengo guardado en CodeSnippets?. La idea es que el código lea la variable y determine un condicional con ese valor.

    Gracias

    1. Avatar de Antonio Villegas

      Entiendo que la tienes que meter en el código PHP de un plugin o del tema. Sin más información, esto es lo que te puedo decir.

  3. Avatar de Javi
    Javi

    Hola Nelio!

    Una pregunta, supón que quieres llamar a esa pregunta al pulsar un botón desde una pantalla creada en la administración.

    ¿Eso se puede hacer?

    ¡Gracias y un saludo!

    1. Avatar de Antonio Villegas

      Si quieres llamar a una función al pulsar un botón, puedes hacer que esa función esté como respuesta a una llamada AJAX. Tienes más info aquí.

  4. Avatar de Gabriel
    Gabriel

    Gracias, muy instructivo. Por cierto el enlace a PHPDoc da 404.

    1. Avatar de Antonio Villegas

      Gracias a ti. Ya hemos arreglado el enlace.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad de Nelio Software

Tus datos personales se almacenarán en SiteGround y serán usados por Nelio Software con el único objetivo de publicar tu comentario aquí. Con el envío de este comentario, nos das el consentimiento expreso para ello. Escríbenos para acceder, rectificar, limitar o eliminar tus datos personales.