Reel 'em In Entendiendo los ganchos desde adentro hacia afuera

La clave de la base flexible de WordPress está en el uso de ganchos. Ya sea en temas, complementos o en el núcleo, los enlaces permiten un crecimiento sin paralelo al tiempo que garantizan la compatibilidad con las futuras versiones de WordPress. Como resultado, comprenderlos sin duda debe ser parte del repertorio de cualquier desarrollador. Participe mientras descubrimos las complejidades de este sistema simple pero sofisticado desde adentro hacia afuera..

Como una hoja de ruta para este artículo, repasaremos el concepto detrás de los ganchos, su implementación y, por supuesto, ejemplos..


Concepto: ¿Qué y por qué??

"En pocas palabras, un gancho es un marcador de posición para una acción".

Detrás de cualquier software bien escrito hay un concepto sólido que responde las preguntas de qué y por qué. Los ganchos no son una excepción. En pocas palabras, un gancho es un marcador de posición para una acción. Cuando se produce un evento significativo, como la publicación de una publicación, se activa un enlace que permite que se produzcan reacciones relevantes. En términos de desarrollador, uno puede pensar en los enganches como la implementación de un sistema basado en eventos..

Más que solo una definición, un concepto requiere un razonamiento que respalde y aclare por qué es útil. Los ganchos desempeñan un papel integral en WordPress debido a la naturaleza en constante evolución del proyecto. Con cientos de desarrolladores que actualizan constantemente el sistema, no es posible editar los archivos principales para cada complemento, tema o personalización especial, ya que estos cambiarán con frecuencia. En su lugar, es necesario un marco para extender el sistema, para permitir que la funcionalidad externa tenga tanto efecto como las manipulaciones internas. Los ganchos son la clave de este marco..


Implementación: cómo?

Como desarrollador, el rol de uno se extiende no solo para comprender qué hace algo o por qué se hace, sino también para darse cuenta de cómo se crea. En otras palabras, para entender completamente el sistema de ganchos, uno debe entender cómo se implementan..

Sin embargo, al igual que en una prueba de opción múltiple, mirar primero las respuestas directamente no es necesariamente la mejor idea. Como sugerirán muchas estrategias para tomar exámenes, a menudo es mejor leer la pregunta, formular sus propios pensamientos acerca de la respuesta y luego elegir la opción que más se parezca a su razonamiento. Se puede poner en práctica un método similar al entender las implementaciones de desarrollo de software; En lugar de mirar el código de otra persona para comprender cómo se realiza una característica, a menudo es incluso más útil implementarla primero y luego volver a examinar cómo se realiza realmente. Esto es exactamente lo que haremos.

En lugar de mirar el código de otra persona para comprender cómo se realiza una característica, a menudo es incluso más útil implementarla primero y luego volver a examinar cómo se realiza realmente..

Inferir a partir de la documentación

Para obtener información sobre cómo se implementa un sistema, la documentación suele ser un buen comienzo. Examinemos los resúmenes de las dos funciones principales de enganche de WordPress según el Codex:

  • add_action ($ hook, $ function [, $ priority [, $ numArgs]]) - Especifica un manejador de funciones., $ función, ser llamado una vez un cierto gancho, $ gancho, Se activa debido a la ocurrencia de un evento.. $ prioridad determina si se llama a este controlador de funciones antes o después de otros controladores de funciones y el valor predeterminado es 10. Las prioridades más bajas dan como resultado que se llame a una función antes y viceversa. $ numArgs es el número de argumentos que tomará el controlador de funciones y el valor predeterminado es 1.
  • do_action ($ hook [, $ arg1 [, $ arg2 [, $ arg3 [,?]]]) - Activa un determinado gancho., $ gancho, Llamando a todas las funciones de manejo con los argumentos opcionales. $ arg1, $ arg2, $ arg3, etc.

Con la documentación en la mano, es hora de hacer algunas inferencias sobre estas dos funciones. add_action simplemente necesita asociar una función, prioridad y número de argumentos con una cadena. Este parece ser el trabajo perfecto para una matriz de PHP, que actúa dualmente como un mapa hash que almacena pares clave-valor. acción_ es aún más trivial, ya que requiere una simple búsqueda en esta misma matriz para encontrar los controladores de funciones correspondientes y luego llamarlos. Con nuestras ideas en mente, es hora de pasar a nuestra implementación.

Aplicando nuestro conocimiento

Debido a que estamos haciendo esto para obtener información sobre el sistema de enganche de WordPress, no hay necesidad de implementar estas dos funciones textualmente de la documentación. En su lugar, concentrémonos en sus implementaciones sin los argumentos opcionales para ahorrar tiempo y aún así obtener la esencia de ello..

Antes de comenzar, vamos a trazar un esquema:

  • Necesitaremos una matriz global que sea accesible para ambas funciones..
  • add_action almacenará el nombre de enlace dado y un conjunto de controladores de funciones correspondientes como un par clave-valor en la matriz.
  • acción_ recuperará los controladores de función correspondientes para un nombre de enlace dado y llamará a cada uno.

Esto produce el siguiente código:

$ actions = array (); function add_action ($ hook, $ function) acciones $ globales; // crea una matriz de manejadores de funciones si no existe ya ((! isset ($ actions [$ hook])) $ actions [$ hook] = array (); // agregue la función actual a la lista de manejadores de funciones $ actions [$ hook] [] = $ function;  function do_action ($ hook) global $ actions; if (isset ($ actions [$ hook])) // llame a cada controlador de función asociado con este hook foreach ($ actions [$ hook] as $ function) call_user_func ($ function); 

No esta mal; implementamos un sistema de gancho versátil en alrededor de 20 líneas de código. Ahora que hemos obtenido una idea de cómo funcionan los ganchos, profundicemos en el código central de WordPress para confirmar nuestra hipótesis.

Una herramienta para navegar rápidamente a través de este código es la referencia cruzada de PHP de Yoast de la fuente de WordPress. Buscando add_action produce el siguiente código:

function add_action ($ tag, $ function_to_add, $ priority = 10, $ accept_args = 1) return add_filter ($ tag, $ function_to_add, $ priority, $ accept_args);  function add_filter ($ tag, $ function_to_add, $ priority = 10, $ accept_args = 1) global $ wp_filter, $ merged_filters; $ idx = _wp_filter_build_unique_id ($ tag, $ function_to_add, $ prioridad); $ wp_filter [$ tag] [$ priority] [$ idx] = array ('function' => $ function_to_add, 'accepted_args' => $ accept_args); unset ($ merged_filters [$ tag]); devuelve verdadero 

add_action llamadas Añadir filtro que, como era de esperar, agrega la función dada a una matriz con el nombre del enganche, $ etiqueta. Aunque hay un poco más involucrado debido a la $ prioridad y $ accept_args Parámetros, esta función concuerda esencialmente con la nuestra, confirmando nuestras sospechas.. acción_, aunque más largo y un poco más complejo, se reduce al siguiente código:

function do_action ($ tag, $ arg = ") [El código omitido que registra estadísticas, procesa argumentos y trata con filtros] do foreach ((array) current ($ wp_filter [$ tag]) como $ the_) if (! is_null ($ the _ ['function'])) call_user_func_array ($ the _ ['function'], array_slice ($ args, 0, (int) $ the _ ['allowed_args'))); while while (next ($ wp_filter [$ etiqueta])! == falso); [Código omitido que se limpia]

Recorrer las funciones asociadas y llamar a cada una no es extraño para todos nosotros; de hecho, es exactamente lo que hipotetizamos en nuestra implementación. En consecuencia, comenzar con nuestros propios pensamientos sobre el código no solo nos ayudó a entenderlo mejor, sino que también requirió pensamiento crítico y resolución de problemas que es esencial para el desarrollo de software..


Ejemplos

Con nuestra comprensión de qué, por qué y qué tan bien en mano, es hora de pasar a dos ejemplos. El primero es un juego en RSS; en lugar de proporcionar notificaciones a través de sindicación, ¿por qué no utilizar el correo electrónico en lugar de?

Sistema de notificación por correo electrónico

Para implementar nuestro sistema, tendremos que buscar cuando se publique una publicación. ¿Pero qué gancho deberíamos usar? La referencia de acción de la API proporciona una lista de enlaces junto con descripciones de los eventos asociados que pueden ayudarnos a identificar exactamente esto. De hecho, el publicar_post La descripción del gancho coincide con lo que necesitamos, así que vamos a agregarle un controlador de funciones:

add_action ('publish_post', 'notify_via_email');

Todo lo que queda es enviar una notificación por correo electrónico a alguien en el Notify_via_email manejador de funciones. Tenga en cuenta que la referencia de acción de la API especifica que la publicar_post Hook pasa la ID de la publicación como un argumento a nuestra función de manejo. Esto nos permitirá obtener información sobre la publicación a través del get_post función, como tal:

la función Notify_via_email ($ post_id) $ post = get_post ($ post_id); $ to = '[email protected]'; $ subject = 'Publicación publicada en'. get_bloginfo ('nombre'); $ message = $ post-> post_title. 'fue publicado en'. get_bloginfo ('nombre'). 'a partir de'. $ post-> post_date. '. Puedes verlo en '. get_permalink ($ post_id). '.'; wp_mail ($ a, $ asunto, $ mensaje); 

Después de recuperar la publicación, empleamos su título, fecha y enlace permanente en nuestro mensaje de correo electrónico. A continuación, se envía a través de la wp_mail función, que requiere un destinatario, asunto y mensaje como sus parámetros. Con eso, nuestro simple sistema de notificación por correo electrónico está completo. Tenga en cuenta que no se recomienda llamar wp_mail varias veces a la vez, ya que está obligado a presentar un retraso significativo en el tiempo de carga de la página una vez que se presiona el botón Publicar publicación.

Complemento de Google Analytics

Al principio, puede parecer que un tema es un medio más adecuado para dicho código. Por el contrario, a través de, como el tema de un sitio es susceptible de revisión y cambio. Como resultado, el código analítico podría perderse fácilmente en una transición de un tema a otro.

Aunque un poco ingenioso, nuestra primera aplicación fue una introducción rápida al uso de ganchos. Este segundo ejemplo, sin embargo, se prestará mucho más al uso en el mundo real. Crearemos un sencillo complemento de Google Analytics que inserta automáticamente el código de seguimiento en el pie de página de una página..

Al principio, puede parecer que un tema es un medio más adecuado para dicho código. Por el contrario, a través de, como el tema de un sitio es susceptible de revisión y cambio. Como resultado, el código analítico podría perderse fácilmente en una transición de un tema a otro. La creación de un complemento evita esta desventaja; Debido a que permanecerá activo independientemente del tema que se emplee, el código analítico seguirá presente y eliminará la necesidad de mantenimiento del tema..

Pero, ¿cómo insertamos el código en el pie de página de un sitio web? Esto, también, se hace a través de ganchos. Si has trabajado en temas de WordPress anteriormente, es probable que hayas llamado wp_head y wp_footer Funciones en la cabecera y pie de página de su sitio web, respectivamente. Ambas funciones están presentes para simplemente activar ganchos para que los complementos puedan insertar fácilmente el código en estas áreas vitales de la página. En consecuencia, simplemente añadiremos una acción a la wp_footer gancho:

add_action ('wp_footer', 'add_google_analytics_code');

Nuestro add_google_analytics_code La función, como su nombre lo indica, imprime el código de Google Analytics:

  

Recuerda cambiar UA-XXXXX-X a su ID de sitio específico y ya está todo listo! Simplemente agregue este código a un archivo y cárguelo en su directorio de complementos de WordPress. Asegúrese de insertar un encabezado de complemento, de esta manera:

No olvide cambiar el nombre del autor, la URI del autor y, por supuesto, activar el complemento!


Conclusión

Al dividir los enlaces en un concepto, una implementación y ejemplos, los hemos examinado de manera efectiva desde el interior del núcleo de WordPress hasta el exterior en una aplicación del mundo real. En lugar de simplemente mirar el código del núcleo de WordPress, implementamos nuestra propia versión de enganches por inferencia, lo que nos permite obtener una comprensión más profunda y de tipo desarrollador de este poderoso sistema. Finalmente, con una aplicación del complemento de Google Analytics en el mundo real, obtuvimos información preliminar sobre qué tan útiles pueden ser los ganchos. Asegúrese de unirse a nosotros la próxima vez y no dude en compartir sus propios e innovadores usos de los ganchos en los comentarios a continuación.!