Cómo hacer que un complemento de WordPress sea extensible

Publicado: 2022-03-10
Resumen rápido ↬ Justo cuando pensabas que finalmente habías encontrado un complemento que hace todo lo que necesitas, todavía hay una pequeña cosa importante que no puede hacer. Descubra cómo hacer que su complemento sea extensible y reducir el dolor de cabeza.

¿Alguna vez has usado un complemento y deseaste que hiciera algo un poco diferente? Tal vez necesitaba algo único que estaba más allá del alcance de la página de configuración del complemento.

Personalmente me he encontrado con esto, y apuesto a que tú también. Si es un desarrollador de complementos de WordPress, lo más probable es que algunos de sus usuarios también hayan encontrado esto mientras usaban su complemento.

Este es un escenario típico: finalmente encontró ese complemento que hace todo lo que necesita, excepto por una pequeña cosa importante. No hay una configuración u opción para habilitar esa pequeña cosa, por lo que navega por la documentación y descubre que no puede hacer nada al respecto. Solicita la función en el foro de soporte del complemento de WordPress, pero no dice nada. Al final, lo desinstalas y continúas con tu búsqueda.

Imagínese si fuera el desarrollador de este complemento. ¿Qué harías si un usuario te pidiera alguna funcionalidad en particular?

Lo ideal sería implementarlo. Pero si la función fuera para un caso de uso muy especial, agregarla no sería práctico. No sería bueno tener una configuración de complemento para la que solo el 0.1% de sus usuarios tendrían un uso.

Solo querrá implementar características que afecten a la mayoría de sus usuarios. En realidad, el 80% de los usuarios utilizan el 20% de las funciones (la regla 80/20). Por lo tanto, asegúrese de que cualquier característica nueva sea muy solicitada y que el 80% de sus usuarios se beneficien de ella, antes de implementarla. Si creó una configuración para cada función que se solicita, entonces su complemento se volvería complicado e inflado, y nadie quiere eso.

Su mejor apuesta es hacer que el complemento sea extensible, en cuanto al código, para que otras personas puedan mejorarlo o modificarlo según sus propias necesidades.

En este artículo, aprenderá por qué es una buena idea hacer que su complemento sea extensible. También compartiré algunos consejos de cómo he aprendido a hacer esto.

¡Más después del salto! Continúe leyendo a continuación ↓

¿Qué hace que un complemento sea extensible?

En pocas palabras, un complemento extensible significa que se adhiere a la parte "O" de los principios SOLID de la programación orientada a objetos, es decir, el principio abierto/cerrado.

Si no está familiarizado con el principio abierto/cerrado, básicamente significa que otras personas no deberían tener que editar su código para modificar algo .

Aplicando este principio a un complemento de WordPress, significaría que un complemento es extensible si tiene disposiciones que permitan a otras personas modificar su comportamiento. Es como WordPress permite a las personas "engancharse" a diferentes áreas de WordPress, pero al nivel del complemento.

Un ejemplo típico de un complemento

Veamos cómo podemos crear un complemento extensible, comenzando con un complemento de muestra que no lo es.

Supongamos que tenemos un complemento que genera un widget de barra lateral que muestra los títulos de las tres últimas publicaciones. En el corazón del complemento hay una función que simplemente envuelve los títulos de esas tres publicaciones en etiquetas de lista:

 function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); $posts = get_posts( $args ); $output = '
    '; foreach ($ publicaciones como $ publicación) { $salida .= '
  • ' . $post->post_title . '
  • '; } $salida .= '
'; devolver $salida; }

Si bien este código funciona y hace el trabajo, no es del todo extensible.

¿Por qué? Debido a que la función se configura a su manera, no hay forma de cambiar su comportamiento sin modificar el código directamente.

¿Qué pasaría si un usuario quisiera mostrar más de tres publicaciones, o tal vez incluir enlaces con los títulos de las publicaciones? No hay manera de hacer eso con el código anterior. El usuario está atascado con el funcionamiento del complemento y no puede cambiarlo.

Incluir cien configuraciones no es la respuesta

Hay varias formas de mejorar el complemento anterior para permitir que los usuarios lo personalicen.

Una de esas formas sería agregar muchas opciones en la configuración, pero incluso eso podría no satisfacer todas las posibilidades que los usuarios querrían del complemento.

¿Qué pasaría si el usuario quisiera hacer algo de lo siguiente (escenarios que revisaremos más adelante):

  • mostrar productos o publicaciones de WooCommerce de una categoría en particular;
  • mostrar los elementos en un carrusel proporcionado por otro complemento, en lugar de una lista simple;
  • realice una consulta de base de datos personalizada y luego use las publicaciones de esa consulta en la lista.

Si agregamos cien configuraciones a nuestro widget, podríamos cubrir los casos de uso anteriores. Pero, ¿qué pasa si uno de estos escenarios cambia y ahora el usuario quiere mostrar solo los productos de WooCommerce que están actualmente en stock? El widget necesitaría aún más configuraciones para adaptarse a esto. Muy pronto, tendríamos miles de millones de configuraciones.

Además, un complemento con una gran lista de configuraciones no es exactamente fácil de usar. Manténgase alejado de esta ruta si es posible.

Entonces, ¿cómo haríamos para resolver este problema? Haríamos el complemento extensible.

Agregar nuestros propios ganchos para hacerlo extensible

Al estudiar el código del complemento anterior, vemos algunas operaciones que realiza la función principal:

  • Obtiene publicaciones usando get_posts .
  • Genera una lista de títulos de publicaciones.
  • Devuelve la lista generada.

Si otras personas modificaran el comportamiento de este complemento, su trabajo probablemente involucraría estas tres operaciones. Para hacer que nuestro complemento sea extensible, tendríamos que agregar ganchos alrededor de estos para abrirlos a otros desarrolladores.

En general, estas son buenas áreas para agregar ganchos a un complemento:

  • alrededor y dentro de los principales procesos,
  • al construir HTML de salida,
  • para modificar consultas de publicaciones o bases de datos,
  • antes de devolver valores de una función.

Un ejemplo típico de un complemento extensible

Tomando estas reglas generales, podemos agregar los siguientes filtros para hacer que nuestro complemento sea extensible:

  • agregue myplugin_get_posts_args para modificar los argumentos de get_posts ,
  • agregue myplugin_get_posts para anular los resultados de get_posts ,
  • agregue myplugin_list_item para personalizar la generación de una entrada de lista,
  • agregue myplugin_get_some_post_titles para anular la lista generada devuelta.

Aquí está el código nuevamente con todos los ganchos agregados:

 function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); // Let other people modify the arguments. $posts = get_posts( apply_filters( 'myplugin_get_posts_args', $args ) ); // Let other people modify the post array, which will be used for display. $posts = apply_filters( 'myplugin_get_posts', $posts, $args ); $output = '
    '; foreach ($ publicaciones como $ publicación) { // Permitir que otras personas modifiquen la entrada de la lista. $salida .= '
  • ' . apply_filters( 'myplugin_list_item', $post->post_title, $post ) . '
  • '; } $salida .= '
'; // Permitir que otras personas modifiquen nuestra lista de salida. return apply_filters('myplugin_get_some_post_titles', $output, $args ); }

También puede obtener el código anterior en el archivo de GitHub.

Estoy agregando muchos ganchos aquí, lo que puede parecer poco práctico porque el código de muestra es bastante simple y pequeño, pero ilustra mi punto: al agregar solo cuatro ganchos, otros desarrolladores ahora pueden personalizar el comportamiento del complemento en todo tipo de formas.

Espacio de nombres y contexto para ganchos

Antes de continuar, tenga en cuenta dos cosas importantes sobre los ganchos que hemos implementado:

  • Estamos espaciando los ganchos con myplugin_ .
    Esto asegura que el nombre del gancho no entre en conflicto con el gancho de algún otro complemento. Esta es solo una buena práctica, porque si se llama a otro gancho con el mismo nombre, podría provocar efectos no deseados.
  • También estamos pasando una referencia a $args en todos los ganchos para el contexto.
    Hago esto para que si otros usan este filtro para cambiar algo en el flujo del código, puedan usar ese parámetro $args como referencia para tener una idea de por qué se llamó al enlace, para que puedan realizar sus ajustes en consecuencia.

Los efectos de nuestros anzuelos

¿Recuerdas los escenarios únicos de los que hablé antes? Revisémoslos y veamos cómo nuestros ganchos los han hecho posibles:

  • Si el usuario desea mostrar productos o publicaciones de WooCommerce de una categoría en particular , puede usar el filtro myplugin_get_posts_args para agregar sus propios argumentos para cuando el complemento consulta las publicaciones, o puede usar myplugin_get_posts para anular completamente las publicaciones con su propia lista.
  • Si el usuario desea mostrar los elementos en un carrusel provisto por otro complemento , en lugar de una lista simple, puede anular la salida completa de la función con myplugin_get_some_post_titles y, en su lugar, generar un carrusel desde allí.
  • Si el usuario desea realizar una consulta de base de datos personalizada y luego usar las publicaciones de esa consulta en la lista, entonces, de manera similar al primer escenario, puede usar myplugin_get_posts para usar su propia consulta de base de datos y cambiar la matriz de publicaciones.

¡Mucho mejor!

Un ejemplo rápido de cómo usar nuestros filtros

Los desarrolladores pueden usar add_filter para conectarse a nuestros filtros anteriores (o usar add_action para acciones).

Tomando nuestro primer escenario anterior, un desarrollador puede simplemente hacer lo siguiente para mostrar los productos de WooCommerce usando el filtro myplugin_get_posts_args que creamos:

 add_filter( 'myplugin_get_posts_args', 'show_only_woocommerce_products' ); function show_only_woocommerce_products( $args ) { $args['post_type'] = 'product'; return $args; }

También podemos usar ganchos de acción

Además de usar apply_filters , también podemos usar do_action para hacer extensible nuestro código. La diferencia entre los dos es que el primero permite que otros cambien una variable, mientras que el segundo permite que otros ejecuten funcionalidades adicionales en varias partes de nuestro código.

Cuando usamos acciones, esencialmente estamos exponiendo el flujo del complemento a otros desarrolladores y permitiéndoles realizar otras cosas en conjunto.

Puede que no sea útil en nuestro ejemplo (porque solo mostramos un código abreviado), pero sería útil en otros. Por ejemplo, dado un complemento de copia de seguridad extensible, podríamos crear un complemento que también cargue el archivo de copia de seguridad en un servicio de terceros como Dropbox.

"¡Genial! Pero, ¿por qué debería preocuparme por hacer que mi complemento sea extensible?

Bueno, si todavía no está convencido de la idea, aquí hay algunas ideas sobre por qué es una buena idea permitir que otras personas modifiquen el comportamiento de su complemento.

Abre el complemento a más posibilidades de personalización

Todo el mundo tiene necesidades diferentes. Y existe una gran posibilidad de que su complemento no los satisfaga a todos, ni puede anticiparlos. Abrir su complemento para permitir modificaciones en áreas clave del comportamiento de su complemento puede hacer maravillas.

Permite a las personas introducir modificaciones sin tocar el código del complemento

Otros desarrolladores no se verán obligados a cambiar los archivos de su complemento directamente. Este es un gran beneficio porque modificar directamente el archivo de un complemento generalmente es una mala práctica. Si el complemento se actualiza, todas sus modificaciones se borrarán.

Si agregamos nuestros propios ganchos para que los usen otras personas, las modificaciones del complemento se pueden colocar en una ubicación externa, por ejemplo, en otro complemento. Hecho de esta manera, el complemento original no se tocará en absoluto, y se puede actualizar libremente sin romper nada, y todas las modificaciones en el otro complemento permanecerán intactas.

Conclusión

Los complementos extensibles son realmente increíbles y nos dan espacio para muchas posibilidades de personalización. Si hace que su complemento sea extensible, sus usuarios y otros desarrolladores lo amarán por ello.

Eche un vistazo a complementos como WooCommerce, Easy Digital Downloads y ACF. Estos complementos son extensibles, y puede darse cuenta fácilmente porque muchos otros complementos en el directorio de complementos de WordPress les agregan funcionalidad. También proporcionan una amplia gama de ganchos de acción y filtro que modifican varios aspectos de los complementos. Las reglas generales que he enumerado arriba han surgido en mi estudio de ellas.

Aquí hay algunos puntos para hacer que su complemento sea extensible:

  • Siga el principio abierto/cerrado. Otras personas no deberían tener que editar su código para modificar algo.
  • Para hacer que su complemento sea extensible, agregue ganchos en estos lugares:

    • alrededor y dentro de los principales procesos,
    • al construir el HTML de salida,
    • para modificar consultas de publicaciones o bases de datos,
    • antes de devolver valores de una función.

  • Espacie los nombres de sus ganchos con el nombre de su complemento para evitar conflictos de nombres.
  • Intente pasar otras variables que estén relacionadas con el gancho, para que otras personas obtengan un contexto de lo que está sucediendo en el gancho.
  • No olvide documentar los ganchos de su complemento, para que otras personas puedan conocerlos.

Otras lecturas

Aquí hay algunos recursos si desea obtener más información sobre la extensión de complementos:

  • Cómo hacer que su complemento de WordPress sea extensible, GitHub
    Todo el código de ejemplo de este artículo.
  • "Consejos útiles para comenzar con los ganchos de WordPress", Thomas Maier, Smashing Magazine
  • "Cómo crear un complemento de WordPress", Daniel Pataki, Smashing Magazine
  • "Hooks", Manual de complementos, WordPress.org